% Name: vdmsl-2e.sty
% Version: 1.1.35b
% $Id: vdmsl-2e.sty,v 1.4 2006/04/07 04:55:51 vdmtools Exp $
% Updated 980907, IFAD. 
% Based on:  
% @(#) vdmsl.sty version 1.1.35 dated 95/07/06 at 11:46:19
% Contact: gip@ditc.npl.co.uk
%
%% ------------------------------------------------------------------%
%%  vdmsl.sty:                                                      -%
%%                                                                  -%
%%      BSI (Proto Standard) VDM SL documentstyle option for LaTeX  -%
%%                                                                  -%
%%       Written by         Jan-Bert Oostenenk, 1990                -%
%%                                                                  -%
%%      I am a student Hoger Informatica Onderwijs (HIO),           -%
%%                     Hogeschool Enschede, The Netherlands.        -%
%%                                                                  -%
%%                                                                  -%
%%      e-mail to Graeme I Parkin  gip@ditc.npl.co.uk               -%
%%                                                                  -%
%%                                                                  -%
%%                                                                  -%
%%                                                                  -%
%%                                                                  -%
%%      Version  1.1.35
%%                                                                  -%
%%      Some parts of this file are copied with permission from     -%
%%      Mario Wolczko from vdm.sty. Mainly the symbols and the      -%
%%      definition of the mathcodes.                                -%
%%      Debugging carried out by I.P.Dickinson                      -%
%%      Debugging and further development by K.J.Lines              -%
%%      Thanks to Derek Andrews and Paul Makherjeei                 -% 
%%                                                                  -%
 \typeout{BSI VDM SL style option <96/05/07> version 1.1.35b for LaTeX2e}
\typeout{This version of the macros contains some changes}
\typeout{which are not backwards compatible with previous}
\typeout{versions. See sections 6.4.10, 12.4.1 and 12.4.2}
\typeout{of the user guide.}
\typeout{Also see sections 5.4.1, 5.5.1, 5.5.7 and 5.6.1}
%% --Customizing------------------------------------------------------%
                     %% Because of changes to latex.tex                       -%
                     %% change order of \begingroup and \def\@currenvir{...}, -%
                     %% necessary for latex versions before 24 May 1989       -%
                     %% Check in latex.tex if \begin, \end and, \@checkend    -%
                     %% are changed on 24 May 1989                            -%
\def\@@precond{\begingroup \def\@currenvir{precond}}%       % if
                                                    %       changed
                                                    %       -%

 % \def\@@precond{\def\@currenvir{precond}\begingroup}    % if not changed -%
\def\@@postcond{\begingroup \def\@currenvir{postcond}}%       % if
                                                    %       changed
                                                    %       -%

 % \def\@@postcond{\def\@currenvir{postcond}\begingroup}    % if not changed -%

\def\VdmSlAuthor{{\sffamily Jan-Bert Oostenenk}}
 \def\VdmSlVersion{\VdmSl\ version 1.1.35}
\def\VdmSl{{\rm\leavevmode{\raise .15ex\hbox{V}\kern-.3em%
            \raise-.4ex\hbox{\sc d\kern-.11em m}\kern-.15em%
            \raise.15ex\hbox{S}\kern-.12em%
            \raise-.4ex\hbox{\sc l}}}}

\newif\ifoldams@
\newif\ifams@
\ams@true
\oldams@false
\ifoldams@
     \ifams@
          \@latexerr{Can't use both AMSFonts 2.0 and the previous version}%
                     {VDMSL.STY has been set up so that it is trying to
                      use both AMSFonts 2.0 and the previous version of the
                      AMS fonts.
                      Tell your system manager to have VDMSL.STY installed
                      correctly.}
     \fi
\fi
\newif\ifps@ \ps@false % PostScript-based
\def\@fmtname{LaTeX2e}
\def\@psfmtname{pslplain}
\def\@testcmsy{\if@usecmsy 
               \else 
                   \@latexerr{Can't use vdm with this PSLaTeX}%
                             {This PSLaTeX does not have the CMSY symbols
                              available, and cannot be used with VDM style.  Get
                              a guru to rebuild PSLaTeX with the CMSY and CMMI
                              fonts included.}
               \fi}
\def\@testcmmi{\if@usecmmi 
               \else
                   \@latexerr{Can't use vdm with this PSLaTeX}%
                             {This PSLaTeX does not have the CMMI symbols
                              available, and cannot be used with VDM style.  Get
                              a guru to rebuild PSLaTeX with the CMSY and CMMI
                              fonts included.}
              \fi}
\ifx\fmtname\@fmtname % standard LaTeX is OK
\else 
    \ifx\fmtname\@psfmtname 
           \global\ps@true 
           \@testcmsy 
           \@testcmmi
    \else 
           \ams@false 
    \fi
\fi % don't use AMS for SliTeX 
\ifams@
        \DeclareFontFamily{U}{msa}{}
        \DeclareFontFamily{U}{msb}{}
\else
        \ifoldams@
                \DeclareFontFamily{U}{msy}{}
                \DeclareFontFamily{U}{msx}{}
        \fi
\fi
\ifams@
     \DeclareFontShape{U}{msa}{m}{n}
                  { <5> <6> <7> <8> <9> gen * msam
                    <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88> msam10}{}
      \DeclareFontShape{U}{msb}{m}{n}
                  { <5> <6> <7> <8> <9> gen * msbm
                    <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88> msbm10}{}
\else
        \ifoldams@
             \DeclareFontShape{U}{msy}{m}{n}
                   { <5> <6> <7> <8> <9> gen * msym
                    <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88> msym10}{}
              \DeclareFontShape{U}{msx}{m}{n}
                   { <5> <6> <7> <8> <9> gen * msxm
                    <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88> msxm10}{}
        \fi
\fi
\ifams@
        \DeclareSymbolFont{AMSa}{U}{msa}{m}{n}
        \DeclareSymbolFont{AMSb}{U}{msb}{m}{n}
\else
        \ifoldams@
                \DeclareSymbolFont{AMSx}{U}{msx}{m}{n}
                \DeclareSymbolFont{AMSy}{U}{msy}{m}{n}
        \fi
\fi
\DeclareMathAlphabet{\mathit}{OT1}{cmr}{m}{it}
\DeclareOldFontCommand{\vdm@it}{\relax}{\mathit}
\let\saved@vdm@it\vdm@it
\everymath=\expandafter{\the\everymath\vdm@it
                        \@changeMathmodeCatcodes}
\everydisplay=\expandafter{\the\everydisplay\vdm@it 
                           \@changeMathmodeCatcodes}
\mathcode`\0="0030
\mathcode`\1="0031
\mathcode`\2="0032
\mathcode`\3="0033
\mathcode`\4="0034
\mathcode`\5="0035
\mathcode`\6="0036
\mathcode`\7="0037
\mathcode`\8="0038
\mathcode`\9="0039
\def\defaultMathcodes{\let\vdm@it\relax}
\def\vdmMathcodes{\let\vdm@it\saved@vdm@it}
{\catcode`\"=\active
 \gdef\@changeMathmodeCatcodes{%
        % make ~ mean \old, " do text, %@ mean subscript
        \let~=\old
        %\catcode`\@=8
        \catcode`\"=\active  \let"=\@mathText}
 \gdef\@mathText#1"{\hbox{\Dquote\MathTextFont{#1}\/\Dquote}}}
 
\ifps@
        \def\@changeOtherMathcodes{
                \mathcode`\:="203A
                \mathcode`\-="002D
                \mathcode`\|="327C 
                \mathchardef\Or="32DA % this is a rel to get 5mu spacing
                \mathcode`\f="0166} % normal letter spacing
\else
        \def\@changeOtherMathcodes{
                \mathcode`\:="203A 
                \mathcode`\-="002D
                \mathcode`\|="326A 
                \mathchardef\Or="325F}% this is a rel to get 5mu spacing
\fi
\def\To{\penalty-100\rightarrow}        % function arrow \ifams@
\def\Pto{ \tilde{\rightarrow}}          % Partial function arrow.
\ifams@
        \DeclareMathSymbol{\Bool}{\mathord}{AMSb}{"42}
        \DeclareMathSymbol{\Nat}{\mathord}{AMSb}{"4E}
        \def\Nati{\Nat_1}
        \DeclareMathSymbol{\Int}{\mathord}{AMSb}{"5A}
        \DeclareMathSymbol{\Real}{\mathord}{AMSb}{"52} 
        \DeclareMathSymbol{\Rat}{\mathord}{AMSb}{"51}
        \DeclareMathSymbol{\@Sconc}{\mathbin}{AMSb}{"079} 
        \def\Sconc{\mathbin{\hbox{\raise.75ex\hbox{$\@Sconc$}}}}
        \DeclareMathSymbol{\Dto}{\mathbin}{AMSa}{"43}   
        \DeclareMathSymbol{\Rto}{\mathbin}{AMSa}{"42}  
\else 
        \ifoldams@
                \DeclareMathSymbol{\Bool}{\mathord}{AMSy}{"42}
                \DeclareMathSymbol{\Nat}{\mathord}{AMSy}{"4E}
                \def\Nati{\Nat_1}
                \DeclareMathSymbol{\Int}{\mathord}{AMSy}{"5A}
                \DeclareMathSymbol{\Real}{\mathord}{AMSy}{"52}
                \DeclareMathSymbol{\Rat}{\mathord}{AMSy}{"51}
                \DeclareMathSymbol{\@Sconc}{\mathbin}{AMSy}{"079}  
                \def\Sconc{\mathbin{\hbox{\raise.75ex\hbox{$\@Sconc$}}}}
                \DeclareMathSymbol{\Dto}{\mathbin}{AMSx}{"43}
                \DeclareMathSymbol{\Rto}{\mathbin}{AMSx}{"42}
        \else
                \def\Bool{\hbox{\bfseries B\/}}
                \def\Nat{\hbox{\bfseries N\/}}
                \def\Nati{\hbox{$\hbox{\bf N}_1$}}
                \def\Int{\hbox{\bfseries Z\/}}
                \def\Real{\hbox{\bfseries R\/}}
                \def\Rat{\hbox{\bfseries Q\/}}
                \def\Sconc{\mathbin{\hbox{\raise.75ex\hbox{$\frown$}\kern-0.47em
                \raise0.2ex\hbox{\it\char"12}}}} 
                \def\Dto{\mathbin{\triangleleft}}
                \def\Rto{\mathbin{\triangleright}}
        \fi
\fi
\let\Natone=\Nati                        % just for an alternative
\def\Set{-\kw{set}}       
\def\Emptyset{\lbrace\mskip\thinmuskip\rbrace}
\def\Emptymap{\lbrace\Mapsto\rbrace}
\def\Seq#1{\seqof{#1}{}}
\def\Emptyseq{[\,]}
\def\Gmap{\buildrel m\over\longrightarrow}
\def\Bmap{\buildrel m\over\longleftrightarrow}
\let\X=\times
\def\Setdiff{\mathbin{\hbox{$\backslash$}}}
\ifps@
          \def\Fdef{\raise.5ex
                    \hbox{\hskip.4em\relax
                    \footnotesize\underline{$\mathchar"3\cmsy@34$}%
                    \hskip.5em\/}}    %      a triangle
        \mathchardef\Minus="222D
  % domain subtraction % range subtraction
        \def\Dby{\mathbin{\hbox{$\rlap{$\mathord\Minus$}\mkern-3mu\hbox{$\Dto$}$}}}
        \def\Rby{\mathbin{\hbox{$\rlap{$\mathord\Minus$}\mkern-1.6mu\Rto$}}}
  \mathchardef\@Exists="0224
  \mathchardef\@All="0222
  \mathchardef\Dot="22D7
\else
  \def\Fdef{\raise.5ex
    \hbox{\hskip.4em\relax
      \footnotesize\underline{$\mathchar"3234$}%
      \hskip.5em\/}}                                         % a triangle
  \mathchardef\Minus="2200
  \def\Dby{\mathbin{\hbox{$\rlap{$\mathord\Minus$}\mkern-1.6mu
        \lower.1ex\hbox{$\Dto$}$}}}
  \def\Rby{\mathbin{\hbox{$\rlap{$\mathord\Minus$}\mkern-1.6mu
        \lower.1ex\hbox{$\Rto$}$}}}
  \mathchardef\@Exists="0239
  \mathchardef\@All="0238
  \mathchardef\Dot="2201
\fi
\def\Oto{\buildrel o\over\rightarrow} % Operation arrow
\let\Mapsto=\mapsto \let\Seqmod=\mapsto \let\Recmod=\mapsto
\def\Ass{\mathrel{:\!=}}
\def\Nondet{\parallel\mskip\medmuskip}
\let\In=\in
\def\Uminus{\hbox{$\Minus\mskip\medmuskip$}}
\def\Uplus{\hbox{$+\mskip\medmuskip$}}
\def\Not{\neg\,}
\def\Power{{\cal F\mskip\medmuskip}}
\let\Dunion=\bigcup
\let\Dinter=\bigcap 
\def\Inverse{^{-1}}
\def\Exponent{\hbox{$\X10\raise.37ex\hbox{$\uparrow$}$}%
  \@ifnextchar+{\def\@tmpa+{\hbox{$+$}}\@tmpa}
    {\@ifnextchar-{\def\@tmpa-{\hbox{$\Minus$}}\@tmpa}{}}}
\let\Exp=\uparrow
\let\Iterate=\uparrow
\let\Union=\cup 
\def\Mapmerge{\mathbin{\shortstack{\tiny m \\[-1.8ex] $\bigcup$}}}
\let\Inter=\cap 
\let\Diff=\setminus
% Swopped around
\let\Psubset=\subset
\let\Subset=\subseteq
\def\Notin{\not\in}
\let\Override=\dagger 
\let\Compose=\circ
\let\And=\land
\let\@and=\and
\def\and{\ifmmode\And\else\@and\fi}
\def\Implies{\penalty-35\mskip 6mu plus 2mu minus 1mu \Rightarrow
        \mskip 6mu plus 2mu minus 1mu}
\def\Equiv{\penalty-50\mskip 7mu plus 2mu minus 2mu
           \Leftrightarrow\mskip 7mu plus 2mu minus 2mu}
\let\Neq=\neq
\let\Le=\leq
\let\Ge=\geq
\def\Exists{\@Exists\,}
\def\All{\@All\,}
\def\Unique{\@Exists!\,}
% Replaced line below to remove clash with LaTeX macro
% \def\Iota{\@iota\,}
\def\Iotaop{\@iota\,}
\let\Lb=\lbrace
\let\Rb=\rbrace
\def\Dcolon{\mskip\thinmuskip\hbox{:\kern.1em:\/}\mskip\thinmuskip}
\let\Range=\ldots
% Replaced line below because clashed with LaTeX macro
% \let\Mu=\mu
\let\Muop=\mu
\def\Lambdaop{\@lambda\,}
\def\Quote{{\mathcode`\'='047 '}}
\def\Dquote{\hbox{\tt\char34}}
\def\Old{\old{\rule{0pt}{1em}}}
\def\Comment{\hbox{ --{--} }}
%_
\gdef\initialise@fonts{
        \gdef\LineNrFont{\footnotesize\rmfamily\upshape}
        \let\ModuleNrFont=\LineNrFont 
        \DeclareTextFontCommand{\ConstantFont}{\scshape}
        \DeclareTextFontCommand{\MathTextFont}{\rmfamily}
        \gdef\CommentFont{\rmfamily}
        \gdef\AnnotationsFont{\rmfamily}
}
\ifx\fmtname\@fmtname       
        \DeclareTextFontCommand{\KeywordFont}{\small\sffamily}
\else
        \ifx\fmtname\@psfmtname
                \DeclareTextFontCommand{\KeywordFont}{\sffamily}
        \else 
                \DeclareTextFontCommand{\KeywordFont}{\bfseries}
        \fi
\fi

\newif\ifVDM@                           \VDM@false
\def\vdm{%
  \ifVDM@\else
    \par 
    \VDM@true
    \set@linebreaks
    \@changeSkips
    \@changeMathmodeCatcodes
    \@changeMargins
    \interlinepenalty\@M   
  \fi \@ignorespaces}
\def\endvdm{\par}                                

\newenvironment{vpp}
{\noindent \rule{\columnwidth}{0.5pt} \begin{alltt}}
{\end{alltt} \rule{\columnwidth}{0.5pt}}


\def\b@mathmode{%\@raggedRight
  \iffn@in@let@ \strut\relax \else \leavevmode$\strut\relax \fi}
\def\e@mathmode{\iffn@in@let@ \relax\strut \else \relax\strut$ \fi}
\newdimen\w@Rindent \w@Rindent=\parindent
\let\VdmBaselineskip=\baselineskip
\def\@changeMargins{\advance\hsize by -\w@Rindent\parindent=\z@}
\def\@restoreMargins{\advance\hsize by\w@Rindent}
\def\@changeSkips{\baselineskip=\VdmBaselineskip
  \lineskip=\z@\lineskiplimit=\z@\parskip=\z@
  % need to alter the size of struts, too
  \setbox\strutbox\hbox{\vrule height.7\baselineskip
      depth.3\baselineskip width\z@}}
\def\Vdmus{\leavevmode \kern.06em\vbox{\hrule\@height .2ex\@width .3em}
  \hskip 0.1em}
\def\kw#1{\hbox{\KeywordFont{#1}\/}}
 
\def\makeNewKeyword#1#2{%        
          \newcommand{#1}{\hbox{\KeywordFont{#2}\/}}}
\def\@mNK#1#2{\def#1{\hbox{\KeywordFont{#2}\/}}}
 
\def\const#1{\hbox{\ConstantFont{#1}\/}}
  
\def\makeNewConstant#1#2{%       
        \newcommand{#1}{\hbox{\ConstantFont{#2}\/}}}
\@mNK\Abs{abs }
\@mNK\Card{card }
\@mNK\Conc{conc }
\@mNK\Char{char}
\@mNK\Div{ div }
\@mNK\Dom{dom }
\@mNK\Elems{elems }
\@mNK\False{false}
\@mNK\Floor{floor }
\@mNK\Hd{hd }
\@mNK\Inds{inds }
\@mNK\Len{len }
\@mNK\Merge{merge }
\@mNK\Mod{ mod }
\@mNK\Nil{nil }
\@mNK\Rd{rd }
\@mNK\Rem{ rem }
\@mNK\Rng{rng }
\@mNK\Tl{tl }
\@mNK\Token{token}
\@mNK\True{true}
\@mNK\Undefined{undefined }
\@mNK\Using{ using }
\@mNK\Wr{wr }
\@mNK\kAs{as }
\@mNK\kAlways{always }
\@mNK\kBeSt{be st }
\@mNK\kBy{by }
\@mNK\kCases{cases }
\@mNK\kCompose{compose }
\@mNK\kDcl{dcl }
\@mNK\kDef{def }
\@mNK\kDefinitions{definitions }
\@mNK\kDo{do }
\@mNK\kElse{else }
\@mNK\kElseif{elseif }
\@mNK\kEnd{end }
\@mNK\kErrs{errs }
\@mNK\kExit{exit }
\@mNK\kExports{exports }
\@mNK\kExt{ext }
\@mNK\kFor{for }
\@mNK\kForAll{for all }
\@mNK\kFrom{from }
\@mNK\kFunctions{functions }
\@mNK\kIf{if }
\@mNK\kImports{imports }
\@mNK\kIn{in }
\@mNK\kInit{init }
\@mNK\kInstantiation{instantiation }
\@mNK\kInv{inv }
\@mNK\kLet{let }
\@mNK\kModule{module }
\@mNK\kOf{of }
\@mNK\kOperations{operations }
\@mNK\kOthers{others }
\@mNK\kParameters{parameters }
\@mNK\kPost{post }
\@mNK\kPre{pre }
\@mNK\kReturn{return }
\@mNK\kReverse{reverse }
\@mNK\kState{state }
\@mNK\kThen{then }
\@mNK\kTixe{tixe }
\@mNK\kTo{to }
\@mNK\kTrap{trap }
\@mNK\kTypes{types }
\@mNK\kValue{value }
\@mNK\kValues{values }
\@mNK\kWith{with }
\@mNK\kWhile{while }
\newcount\c@module  \c@module=\z@                         
\newcount\c@outer   \c@module=\z@                       
\newcount\c@inner                           
\newdimen\w@outer                              
\newdimen\w@inner                              
\newdimen\wi@ln                   
\def\setindent#1#2{\expandafter \csname w@#1\endcsname=#2 \relax
  \@iflnw{#1}\@ifannw{#1}\ignorespaces}
\def\addtoindent#1#2{
  \def\@ann{AnnIndent}
  \def\@@firstarg{#1}
  \expandafter\global
  \expandafter\advance
  \expandafter\csname w@#1\endcsname by #2\relax
  \ifx \@ann\@@firstarg
      \@ifannw{#1}
  \else
      \@iflnw{#1}
  \fi 
  \ignorespaces}
\def\setindenttowidth#1#2{\ifmmode\setbox\tmp@box=\hbox{$\strut#2\strut$}%
 \else\setbox\tmp@box=\hbox{#2}\fi
 \expandafter\csname w@#1\endcsname=\wd\tmp@box
 \@iflnw{\wd\tmp@box}\@ifannw{\wd\tmp@box}\ignorespaces}
\def\width#1{\csname w@#1\endcsname}
\def\newindent#1#2{\expandafter\@ifdefinable \csname w@#1\endcsname
  {\expandafter\newdimen \csname w@#1\endcsname\setindent{#1}{#2}}}
\def\@iflnw#1{{
   \def\@inner{inner}
   \def\@outer{outer}
   \def\@tmpa{#1}%
   \ifx \@inner\@tmpa
        \global\let\@gtmpa=\setw@ln
   \else 
        \ifx \@outer\@tmpa 
             \global\let\@gtmpa=\setw@ln
        \fi 
   \fi}
% macro works on the assumption that #1 is either 'inner'
% or 'outer'     kjl 24/7/92
   \@gtmpa}
\def\@ifannw#1{{%
   \def\@tann{AnnIndent}
   \def\@tmpa{#1}%
   \ifx \@tann\@tmpa 
       \global\let\@gtmpa\setw@ann 
   \fi}
% macro works on the assumption that #1 is 'AnnIndent'  kjl 24/7/92
   \@gtmpa}
\def\setw@ln{\wi@ln=\w@outer \advance\wi@ln by\w@inner \relax}
\def\lninc@outer{\global\advance\c@outer by \@ne \global\c@inner=\z@}           
\def\lninc@inner{\global\advance\c@inner by \@ne}      
    
\def\lnput@module{\ModuleNrFont\themodule}    
\def\lnput@outer{\LineNrFont\the\c@outer}                
\def\lnput@inner{\LineNrFont.\the\c@inner}              
\def\lnput@.{\LineNrFont.}
\def\lnbox@module{%                                              
  \hbox to \wi@ln{\hss\lnput@module\hskip \w@inner}}
\def\lnbox@outer@inner{%                                         
  \hbox to \wi@ln{\hss\lnput@outer\hbox to\w@inner{\lnput@inner\hss}}}
\def\lnbox@outer@{%                                              
  \hbox to \wi@ln{\hss\lnput@outer\hbox to\w@inner{\lnput@.\hss}}}
\def\lnbox@@inner{%                                              
  \hbox to\wi@ln{\hss\hbox to\w@inner{\lnput@inner\hss}}}
\def\lnbox@{\hbox to\wi@ln{}}
\def\lnout@{\lnbox@\penalty\@M\@indent\penalty\@M}
\def\linenumbering{%
  \def\lnout@m{\lninc@module \lnbox@module \penalty\@M \@indent \penalty\@M}%
  \def\lnout@oi{\lninc@outer \lnbox@outer@inner \penalty\@M
    \@indent \penalty\@M}%
  \def\lnout@o{\lninc@outer \lnbox@outer@ \penalty\@M 
    \@indent \penalty\@M}%
  \def\lnout@i{\lninc@inner \lnbox@@inner \penalty\@M \@indent \penalty\@M}%
  \let\annlab=\@annlab}
\def\nolinenumbering{\let\lnout@m=\lnout@ \let\lnout@oi=\lnout@
  \let\lnout@o=\lnout@ \let\lnout@i=\lnout@
  \def\annlab[##1]##2{\ignorespaces}}
\def\modulenumbering#1{\gdef\themodule{\csname @#1\endcsname\c@module}
  \gdef\lninc@module{\global\advance\c@module by \@ne \global\c@outer=\z@}}
\def\nomodulenumbering{\global\let\themodule=\@empty
  \gdef\lninc@module{\global\advance\c@module by \@ne}}
\def\set@linebreaks{%
    \let\@old@linebr=\\%                                           
                    %  ^ this is a bug in TeX if no '%' a space is inserted
    \def\@linebr{\newline \lnout@i \ignorespaces}%
    \let\\=\@linebr}
\def\@par@linebr{\@par\leavevmode \lnout@i \@ignorespaces}
\def\@linebr{%                            
  \newline \lnout@i \ignorespaces}
\def\reset@linebreaks{%
  \let\\=\@old@linebr
  \let\@linebr=\\}
\def\I#1{\\\hskip #1\relax}
\def\R{\\\hspace*{\fill}}
\def\V{\@ifoptarg{\@V@linebr}{\@V@linebr\z@]}}
\def\@V@linebr#1]{\ifmmode $\@@par\vskip#1\relax\leavevmode \lnout@i $%
  \else\@par\vskip#1\relax\leavevmode \lnout@i \fi \@ignorespaces}% 
\newdimen\w@small@indent        \w@small@indent=0.3em  %kjl 17/3/93
\newdimen\w@Indent              \w@Indent=1em  
\newdimen\w@IIndent             \w@IIndent=1em
\newdimen\w@IIIndent            \w@IIIndent=1em
\newdimen\w@DIndent             \w@DIndent=2em
\newdimen\wi@indent \wi@indent\z@        
\def\@indent{\hskip\wi@indent\relax}    
                                        
\def\add@indent#1{\global\advance\wi@indent by #1\relax}
\def\sub@indent#1{\global\advance\wi@indent by -#1}
\def\copy@indent#1{\setbox\tmp@box=\hbox{$\copy\strutbox\relax
  #1\copy\strutbox$}\global\advance\wi@indent by\wd\tmp@box\box\tmp@box\relax}
\def\addw@indent#1{\setbox\tmp@box=\hbox{$\copy\strutbox\relax
  #1\copy\strutbox$}\global\advance\wi@indent by \wd\tmp@box\relax}
\def\subw@indent#1{\setbox\tmp@box=\hbox{$\copy\strutbox\relax
  #1\copy\strutbox$}\global\advance\wi@indent by -\wd\tmp@box\relax}
\def\add@small{\global\advance\wi@indent by\w@small@indent\relax}
\def\sub@small{\global\advance\wi@indent by-\w@small@indent\relax}
\def\add@I{\global\advance\wi@indent by\w@Indent\relax}
\def\sub@I{\global\advance\wi@indent by-\w@Indent\relax}
\def\add@II{\global\advance\wi@indent by\w@IIndent\relax}
\def\sub@II{\global\advance\wi@indent by-\w@IIndent\relax}
\def\add@III{\global\advance\wi@indent by\w@IIIndent\relax}
\def\sub@III{\global\advance\wi@indent by-\w@IIIndent\relax}
\def\add@DI{\global\advance\wi@indent by\w@DIndent\relax}
\def\sub@DI{\global\advance\wi@indent by-\w@DIndent\relax}
\def\kw@indent#1{\setbox\tmp@box=\kw{#1}%
  \global\advance\wi@indent by \wd\tmp@box \box\tmp@box \relax}
\def\sub@kw@indent#1{\setbox\tmp@box=\kw{#1}%
  \global\advance\wi@indent -\wd\tmp@box\relax}
\def\sb@indent#1{\setbox\tmp@box=\hbox{$\copy\strutbox\relax#1\copy\strutbox$}%
  \global\advance\wi@indent by\wd\tmp@box \box\tmp@box\relax}
\def\@nopagebreak{\gdef\par{\@@par \penalty\@M \global\let\par=\@@par
  \penalty\@M}}
\def\startpagebreaks{\interlinepenalty=400}
\def\@ignorespaces{\global\@ignoretrue\ignorespaces}
\def\@emptyHooks#1{%                                          
  \expandafter\gdef\csname pre#1Hook\endcsname{} 
  \expandafter\gdef\csname post#1Hook\endcsname{}}
\def\@newSkip#1#2{%                                 
  \expandafter\newskip\csname pre#1Skip\endcsname
  \expandafter\csname pre#1Skip\endcsname=#2\relax}
\def\@newSkips#1#2#3{%              
  \expandafter\newskip\csname pre#1Skip\endcsname
  \expandafter\csname pre#1Skip\endcsname=#2\relax
  \expandafter\newskip\csname post#1Skip\endcsname
  \expandafter\csname post#1Skip\endcsname=#3\relax}

% kjl 30/7/91
\def\b@Macro#1#2{%
  \par \vskip#1 \relax#2\leavevmode}
\def\e@Macro#1#2{#1\vskip#2\relax}
\def\endMacroHook{}
\newskip\endMacroSkip           \endMacroSkip=1ex plus .2ex minus .2ex
\def\endMacro{\e@Macro\endMacroHook\endMacroSkip}
\def\b@Kw@I#1#2#3#4{%
  \par \vskip#3 \relax #4\First@true \leavevmode \lnout@ \kw{#2}%
  \def\e@Kw@I##1##2{\sub@indent{#1}##1\vskip##2\relax\ignorespaces}%
  \add@indent{#1}\@nopagebreak\ignorespaces}
\def\b@Kw@II#1#2#3#4{%
  \par \vskip #2\relax #3\First@true \leavevmode \lnout@ \kw{#1}%
  \add@indent{#4}\def\ei@Kw@II{\sub@indent{#4}}%
  \def\e@Kw@II##1##2{\sub@indent{#4}##1\vskip##2\relax\ignorespaces}
  \@nopagebreak\ignorespaces}
\newif\ifnl@                    \nl@false              
 \def\@iflinebr#1#2{\@ifnextchar\\{\nl@true\def\@tmpa\\{#1}\@tmpa}
                                 {\global\nl@false#2}}
\def\@ifoptarg#1#2{\@ifnextchar[{\def\@tmpa[{#1}\@tmpa}{#2}}
\def\@iflinebrarg#1#2#3#4{%
 \@iflinebr{\@ifnextchar[{\def\@tmpa[{#1}\@tmpa}{#2}}
           {\@ifnextchar[{\def\@tmpa[{#3}\@tmpa}{#4}}}
\def\@iflinebrstar#1#2#3#4{%
  \@iflinebr{\@ifnextchar*{\def\tmpa*{#1}\tmpa}{#2}}
            {\@ifnextchar*{\def\tmpa*{#3}\tmpa}{#4}}}
\newif\ifempty@
\def\@ifempty#1{%\empty@true\ifx#1\else\empty@false\fi\ifempty@}
  \def\@tmpa{#1x}\def\@tmpb{x}\ifx\@tmpa\@tmpb}
\newif\ifFirst@                 \First@false
\def\F@comma{%
        \ifpunct@set@it@
                \global\punct@set@it@false
        \else
                \ifFirst@ 
                        \global\First@false 
                \else ,
                \fi
        \fi}                            
                                              
% kjl 18/3/93
\def\F@comma@pl{%
        \ifpunct@set@it@
                \global\punct@set@it@false
                \@par@linebr
        \else
                \ifFirst@ 
                        \global\First@false 
                \else
                        ,%
                        \@par@linebr
                \fi
        \fi}
% kjl 18/3/93    26/3/93
\def\F@comma@linebr{%
        \ifpunct@set@it@
                \global\punct@set@it@false
                \@linebr
        \else
                \ifFirst@ 
                        \global\First@false 
                \else,%
                     \@linebr 
                \fi
        \fi}
\def\F@linebr{\ifFirst@% 
                  \global\First@false 
              \else 
                  \@linebr 
              \fi}
\def\F@par@linebr{\ifFirst@ 
                     \global\First@false 
                  \else 
                      \@par@linebr 
                  \fi}
\newdimen\wi@id                  \wi@id=0pt
\newif\ifId@w@                   \Id@w@false
\def\leftalignment{\let\@left@hss\@empty \let\@mid@hss\hss \let\@right@hss=\hss}
\def\rightalignment{\let\@left@hss\hss \let\@mid@hss\@empty 
  \let\@right@hss\@empty}
\def\b@id@indent#1#2{%
 \@ifempty{#2} \hskip\wi@id \setbox\tmp@box=\hbox{$\strut #1\strut$}%
   \hskip\wd\tmp@box \add@indent{\wd\tmp@box}% 
 \else 
    \ifId@w@ \let\\=\w@id@linebr
      \hbox to \wi@id \bgroup \@left@hss$#2$\@mid@hss \egroup%
    \else \let\\=\id@linebr
      \setbox \tmp@box=\hbox \bgroup $#2$\egroup
      \wi@id=\wd\tmp@box \box\tmp@box \fi
    \sb@indent{#1}%
  \fi 
  \def\e@id@indent{\sub@indent\wi@id \subw@indent{#1}}%
  \let\\=\@linebr \add@indent\wi@id}
\def\setw@id#1{\@ifoptarg{\@setw@id{#1}}{\Id@w@false#1}}
\def\@setw@id#1#2]{\Id@w@true \setbox \tmp@box=\hbox{$#2$}%
  \wi@id=\wd\tmp@box \relax #1}
\def\w@id@linebr{\strut $\@mid@hss \egroup \@linebr 
  \hbox to \wi@id \bgroup \@left@hss$}
\def\id@linebr{\strut $\egroup \box\tmp@box \@linebr 
  \setbox\tmp@box \hbox \bgroup $}
\def\F@bls#1{\F@bl@cl\t@bl@one={#1}\@bls}
\def\@bls{\@iflinebr{\ml@bls}{\sl@bls}}
\def\sl@bls#1{\b@bl@one@indent\bl@sep
  \M@bl@two\b@bl@two#1\e@bl@two\M@bl@two\e@bl\e@bls\ignorespaces%
  }
\def\ml@bls#1{\M@bl@one\the\t@bl@one\@sep\M@bl@one\add@DI\\
  \M@bl@two#1\M@bl@two\sub@DI\e@bls\ignorespaces}
\let\b@bl@two=\@empty\let\e@bl@two=\@empty\let\e@bls=\@empty
\def\IM@bls{\let\M@bl@one=\@empty\let\M@bl@two=\@empty       
  \let\F@bl@cl=\F@comma@linebr}
\def\MN@bls{\let\M@bl@two=\@empty                
  \ifmmode\let\M@bl@one=\empty\let\F@bl@cl=\F@comma@linebr
  \else \let\M@bl@one=$\let\F@bl@cl=\F@comma@pl \fi}
\def\MM@bls{\let\M@bl@one=$\let\M@bl@two=$%             
  \let\F@bl@cl=\F@comma@pl}
\def\AM@bls{\ifmmode\IM@bls\else\MM@bls\fi}        
\def\MC@bls{\ifmmode\IM@bls\else\MN@bls\fi}          
\newdimen\wi@blo
\newdimen\wi@sep                                \wi@sep=\z@
\newdimen\wi@old@indent
\newdimen\wi@w@blo
\newtoks\t@bl@one
\newbox\tmp@box
\newif\ifWidth@bl@one                   \Width@bl@onefalse
\def\setw@bl#1{\@ifoptarg{\setw@@bl@one{#1}}{\Width@bl@onefalse#1}}
\def\setw@@bl@one#1#2]{\Width@bl@onetrue
  \setbox\tmp@box=\hbox{$\strut#2\strut$}\wi@blo=\wd\tmp@box\relax#1}
\def\b@bl@one@indent{%
  \wi@old@indent=\wi@indent
  \ifWidth@bl@one 
    \let\\=\bl@w@linebr
    \hbox to \wi@blo \bgroup \@left@hss $
      \the\t@bl@one \strut $\@right@hss \egroup
  \else
    \let\\=\bl@linebr
    \wi@w@blo=\wi@indent 
    \setbox\tmp@box=\hbox \bgroup $ \the\t@bl@one \strut $\egroup
    \wi@blo=\wd \tmp@box \box \tmp@box
    \advance\wi@blo -\wi@old@indent
    \advance\wi@blo\wi@w@blo
  \fi
  \let\\=\@linebr
  \add@indent\wi@blo}
\def\e@bl{\sub@indent{\wi@blo}\sub@indent{\wi@sep}}
\def\bl@w@linebr{\strut $\@right@hss \egroup \@linebr
  \wi@w@blo=\wi@blo \advance\wi@w@blo\wi@old@indent
  \advance\wi@w@blo -\wi@indent
  \hbox to\wi@w@blo \bgroup \@left@hss $}
\def\bl@linebr{\strut $ \egroup \box\tmp@box \@linebr
  \wi@w@blo=\wi@indent 
  \setbox\tmp@box=\hbox \bgroup $}
\def\bl@sep{\setbox\tmp@box=\hbox{$\strut\@sep\strut$}%
  \wi@sep=\wd\tmp@box\add@indent{\wi@sep}\box\tmp@box}
\def\b@bl{\b@bl@one@indent\bl@sep}
\def\@bl{\M@bl@one\m@bl\M@bl@one}
\def\m@bl{\the\t@bl@one\@sep}
\newtoks\t@ModuleName                        
\@newSkips{Module}{2ex plus .5ex minus .3ex}{2ex plus .5ex minus .3ex}
\@emptyHooks{Module}
\def\module{\@ifoptarg{\@module}{\@module\w@Indent]}}
\def\@module#1]#2{%
  \global\wi@indent=\z@
  \def\endmodule{\leavevmode\sub@indent{#1}\lnout@ \kw{end }$#2$%
    \e@Macro\postModuleHook\postModuleSkip}
  \b@Macro\preModuleSkip\preModuleHook\lnout@m
  \t@ModuleName={#2}                       
  \kw{module }$#2$%                    
  \add@indent{#1}\def\ei@module{\sub@indent{#1}}
  \@ifoptarg{\opt@annlab{m}}{}}
\@newSkips{Interface}{1ex plus .3ex minus .2ex}{1ex plus .3ex minus .2ex}
\@emptyHooks{Interface}
\def\interface{\@ifoptarg{\@interface}{\@interface\w@Indent]}}
\def\@interface#1]#2{%
  \b@Kw@I{#1}{#2 }{\preInterfaceSkip}{\preInterfaceHook}}
\def\endinterface{\e@Kw@I\postInterfaceHook\postInterfaceSkip}
  
\@newSkip{From}{1ex plus .3ex minus .2ex}
\@emptyHooks{From}
\def\from{\@ifoptarg\@from{\@from\w@IIndent]}}
\def\@from#1]#2{\def\endfrom{\sub@indent{#1}\postFromHook\@ignorespaces}%
  \F@comma                              
  \b@Macro\preFromSkip\preFromHook\lnout@oi
  \kw{from }$#2$\add@indent{#1}\@nopagebreak}
\@newSkip{Instance}{1ex plus .3ex minus .2ex}
\@emptyHooks{Instance}
\def\instance{\@ifoptarg\@instance{\@instance\w@IIndent]}}
\def\@instance#1]{%
  \def\endinstance{\sub@indent{#1}\postInstanceHook\@ignorespaces}%
  \def\e@inst{\add@indent{#1}\@nopagebreak\ignorespaces}%
  \inst}
\def\inst#1#2{\t@bl@one={#1\ \kw{as }#2}%
  \F@comma
  \b@Macro\preInstanceSkip\preInstanceHook\lnout@oi
  \@iflinebrarg{\nl@subst}
               {\@as$\mskip\thinmuskip()$\e@inst}
               {\sl@subst}
               {\@as$\mskip\thinmuskip()$\e@inst}}
\def\@as{\add@II$\the\t@bl@one $\sub@II}
\def\nl@subst#1]{\@as \add@DI \\\Lp $#1$\Rp \sub@DI \e@inst}
\def\sl@subst#1]{\def\@sep{\mskip\thinmuskip(}\b@bl $#1)$\e@bl\e@inst}
\def\e@inst{\postInstanceHook\ignorespaces}
\@newSkip{Modulesignature}{1ex plus .3ex minus .2ex}
\@emptyHooks{Modulesignature}
\def\modulesignature{\@ifoptarg\@modsignature{\@modsignature]}}
\def\modsig{\@ifoptarg{\@modsig}{\@modsig]}}
\def\@modsig#1]#2#3{\@modsignature#1]{#2}#3\endmodulesignature}
\def\@modsignature#1]#2{\First@true            
  \b@Macro\preModulesignatureSkip\preModulesignatureHook
  \@ifempty{#1}%
    \lnout@oi\kw@indent{#2 }%
    \def\endmodulesignature{\e@mathmode\sub@kw@indent{#2 }%
      \postModulesignatureHook\@ignorespaces}%
  \else
    \lnout@ \kw{#2}\newline\add@indent{#1}\lnout@oi%
    \def\endmodulesignature{\e@mathmode\sub@indent{#1}%
      \postModulesignatureHook\@ignorespaces}%
  \fi
  \b@mathmode}
\@newSkips{Definitions}{2ex plus .5ex minus .3ex}{2ex plus .5ex minus .3ex}
\@emptyHooks{Definitions}
\def\definitions{\@ifoptarg{\@definitions}{\@definitions\w@Indent]}}
\def\@definitions#1]{%
  \b@Kw@I{#1}{definitions}{\preDefinitionsSkip}{\preDefinitionsHook}}
\def\enddefinitions{\e@Kw@I{\postDefinitionsHook}{\postDefinitionsSkip}}
\@newSkips{Typesdef}{1ex plus .3ex minus .2ex}{1.75ex plus .4ex minus .2ex}
\@emptyHooks{Typesdef}
\def\typedef{\@ifoptarg{\@typedef}{\@typedef\w@IIndent]}}
\def\@typedef#1]{\Def@true\FirstDef@true
  \b@Kw@II{types}{\preTypesdefSkip}{\preTypesdefHook}{#1}}
\def\endtypedef{\e@Kw@II\postTypesdefHook\postTypesdefSkip}
\@emptyHooks{Type}
\@newSkips{Type}{1.75ex plus .4ex minus .2ex}{1.75ex plus .4ex minus .2ex}
\def\type{\b@type \setw@id\@type}
\def\@type#1{\@iflinebr{\nl@type{#1}}{\sl@type{#1}}}
\def\sl@type#1#2{\ifx \Inyd #2 \b@id@indent{}{#1}#2%
  \else \b@id@indent{=}{#1}#2\fi \e@id@indent \e@type}
\def\nl@type#1#2{%
  \ifx #2\Inyd #1\else#1 =\fi\add@DI\\#2\sub@DI\e@type}
\def\b@type{\begingroup \@semicolon \b@Macro\preTypeSkip\preTypeHook\lnout@oi $}
\def\e@type{$\ifDef@ \postTypeHook%
  \else \e@Macro\postTypeHook\postTypeSkip\fi\endgroup\ignorespaces%
  }
\def\record{\setw@id\@record}
\def\@record#1{%
  \ifmmode \def\endrecord{\subw@indent{#1\Dcolon}}%
  \else \b@type \def\endrecord{\subw@indent{#1\Dcolon}\e@type}\fi%
  \copy@indent{#1\Dcolon}\First@true%
  \@ifnextchar:\@rfl\@rfl} 
\def\@rfl#1:#2\\{\F@linebr%
  \b@id@indent{:}{#1}#2\e@id@indent \@ifnextchar\end{}{\@rfl}}
\def\composite{%
  \ifmmode \def\endcomposite{\sub@III \\\kw{end}}%
  \else \def\endcomposite{\sub@III \\\kw{end}\e@type}%
    \b@type \fi
  \add@III \setw@id\@composite}
\def\@composite#1{\kw{compose }#1\kw{ of}%
  \@ifnextchar:\@cfl\@cfl} 
\def\@cfl#1:#2\\{\\ \b@id@indent{:}{#1}#2\e@id@indent 
  \@ifnextchar \end{}{\@cfl}}
\def\compose#1#2{% 
  \ifmmode \kw{compose }#1\kw{ of }#2\kw{ end}%
  \else \b@type \kw{compose }#1\kw{ of }#2\kw{ end}\e@type \fi}
\def\setof#1{#1\kw{-set}}
\def\seqof#1#2{\ifx #1*{{#2}^*}\else\ifx #1+{{#2}^+}%
  \else{{#2}^{??}}\fi\fi}
\@newSkips{Statedef}{1ex plus .3ex minus .2ex}{1.75ex plus .4ex minus .2ex}
\@emptyHooks{Statedef}
\def\statedef{\Def@true\setw@id\@statedef}
\def\endstatedef{\sub@III \\\kw{end}%
  \e@Macro\postStatedefHook\postStatedefSkip}
\def\@statedef#1{%
  \b@Macro\preStatedefSkip\preStatedefHook\lnout@oi
  \kw@indent{state }$#1$\sub@kw@indent{state }\kw{ of}\add@III
  \@ifnextchar:\@sfl\@sfl} 
\def\state#1#2{%
  \b@Macro\preStatedefSkip\preStatedefHook\lnout@oi
  \kw{state }$#1\kw{ of }#2$\kw{ end}%
  \e@Macro\postStatedefHook\postStatedefSkip}
\def\@sfl#1:#2\\{\\$%
  \b@id@indent{:}{#1}#2\e@id@indent $%
  \@ifnextchar\begin{}{%
    \@ifnextchar\inv{}{%
      \@ifnextchar\init{}{%
        \@ifnextchar\end{}{\@sfl}}}}}
  
\@emptyHooks{Invfn}
\@newSkips{Invfn}{1ex plus .3ex minus .2ex}{1.75ex plus .4ex minus .2ex}
\def\inv#1#2{\invfn{#1}#2\endinvfn}
\def\invfn#1{%
  \ifDef@ \b@Macro\preInvfnSkip\preInvfnHook%
  \else \b@Macro\z@\preInvfnHook\fi \lnout@i%
  $\kw@indent{inv }\add@DI #1\sub@DI \Fdef}
\def\endinvfn{\sub@kw@indent{inv }$\ifDef@ \postInvfnHook%
  \else \e@Macro\postInvfnHook\postInvfnSkip\fi\@ignorespaces%
}
\@emptyHooks{Initfn}
\@newSkip{Initfn}{1ex plus .3ex minus .2ex}
\def\init#1#2{\initfn{#1}#2\endinitfn}
\def\initfn#1{%
  \b@Macro\preInitfnSkip\preInitfnHook\lnout@i $%
  \kw@indent{init }\add@DI #1\sub@DI \Fdef}
\def\endinitfn{\sub@kw@indent{init }$\postInitfnHook\@ignorespaces%
}
\@newSkips{Valuesdef}{1ex plus .3ex minus .2ex}{1.75ex plus .4ex minus .2ex}
\@emptyHooks{Valuesdef}
\def\valuedef{\@ifoptarg{\@valuedef}{\@valuedef\w@IIndent]}}
\def\@valuedef#1]{\Def@true\FirstDef@true
  \b@Kw@II{values}\preValuesdefSkip \preValuesdefHook{#1}}
\def\endvaluedef{\e@Kw@II\postValuesdefHook\postValuesdefSkip}
\let\valdef=\valuedef
\let\endvaldef=\endvaluedef
\@newSkips{Valdef}{1ex plus .3ex minus .2ex}{1.75ex plus .4ex minus
.2ex}
\@emptyHooks{Valdef}
\@emptyHooks{Value}
\@newSkips{Value}{1.75ex plus .4ex minus .2ex}{1.75ex plus .4ex minus .2ex}
% kjl 15/3/93
\def\oldvalue{\begingroup 
                  \@semicolon 
                  \b@Macro\preValueSkip\preValueHook
                  \lnout@oi 
                  \setw@id\@oldvalue}
\def\@oldvalue#1{$\@iflinebr{%
                             \nl@value{#1}}
                             {\sl@value{#1}}
                }
\def\sl@value#1#2{%
  \def\@@@tempa{#2}
  \def\@@@tempb{\Inyd}
  \ifx\@@@tempa\@@@tempb
       \b@id@indent{}{#1}
       \def\ei@value{\Inyd\e@id@indent}%
       \let\esi@value=\@empty
  \else
       \b@id@indent{}{#1}
       \def\ei@value{\sb@indent{=}#2\e@id@indent}
       \def\esi@value{\subw@indent{=}}
  \fi
  \sl@val@type}
\def\nl@value#1#2{% 
    \def\@@@tempa{#2}
    \def\@@@tempb{\Inyd}
    \ifx\@@@tempa\@@@tempb
        #1%
        \def\ei@value{\add@DI\\\kw {is not yet defined}\sub@DI}
    \else
        #1 
        \def\ei@value{=\add@DI \\#2 \sub@DI}
    \fi
    \nl@val@type }
% kjl 16/3/93
\def\sl@val@type{\@iflinebrarg {\sl@nl@val@type}
                               {\ei@value\esi@value\e@value}
                               {\sl@sl@val@type}
                               {\ei@value\esi@value\e@value}
                }
\def\nl@val@type{\@iflinebrarg {\nl@nl@val@type}
                               {\ei@value\e@value}
                               {\sl@nl@val@type}
                               {\ei@value\e@value}
                }
\def\sl@sl@val@type#1]{:#1 \esi@value \ei@value \e@value}
\def\nl@nl@val@type#1]{:\add@DI \\#1\sub@DI \ei@value \e@value}
\def\sl@nl@val@type#1]{:#1\ei@value\e@value}
\def\e@value{$\ifDef@ \postValueHook
  \else \e@Macro\postValueHook\postValueSkip \fi\endgroup\ignorespaces%
  }
\def\val{\begingroup
              \@semicolon
              \b@Macro\preValueSkip\preValueHook
              \lnout@oi
              \setw@id\@val}
\def\@val#1{%
        $
        \b@id@indent{}{#1}
        \@ifoptarg{\need@type}{\no@type}
}
\def\need@type#1]{\copy@indent{: #1} 
                  \def\sub@type@indent{\subw@indent{: #1}}
                  \rest@of@type}
\def\no@type{\let\sub@type@indent=\@empty
             \rest@of@type}
\def\rest@of@type{\@iflinebr{\out@newline@value}{\out@value}}
\def\out@value#1{%
        \def\@@@tempa{#1}
        \def\@@@tempb{\Inyd}
        \ifx\@@@tempa\@@@tempb
                \Inyd%
                \let\sub@eq@ind=\@empty
        \else
                \sb@indent{=}#1%
                \def\sub@eq@ind{\subw@indent{=}}
        \fi
        \fin@val}
\def\out@newline@value#1{%
        \def\@@@tempa{#1}
        \def\@@@tempb{\Inyd}
        \ifx\@@@tempa\@@@tempb
                \add@DI\\\kw {is not yet defined}\sub@DI
        \else
                 %=\add@DI \\#1 \sub@DI
                 %\sb@indent{=} \\ #1 \subw@indent{=}
                 =\add@small \\ #1 \sub@small 
        \fi
        \let\sub@eq@ind=\@empty
        \fin@val}
\def\fin@val{%
        \sub@type@indent
        \sub@eq@ind
        \e@id@indent
        \e@value}
\def\e@value{$% 
             \ifDef@ 
                 \postValueHook
             \else 
                 \e@Macro\postValueHook\postValueSkip 
             \fi
             \endgroup%
             \ignorespaces%
             }
\def\Opt#1{[#1]}
\newif\ifDef@                   \Def@false %if in definition
\newif\ifFirstDef@      %first in definition    
\@newSkips{Funcdef}{1ex plus .3ex minus .2ex}{1.75ex plus .4ex minus .2ex}
\@emptyHooks{Funcdef}
\def\funcdef{\@ifoptarg\@funcdef{\@funcdef\w@IIndent]}}
\def\@funcdef#1]{\Def@true\FirstDef@true
  \b@Kw@II{functions}{\preFuncdefSkip}{\preFuncdefHook}{#1}}
\def\endfuncdef{\e@Kw@II\postFuncdefHook\postFuncdefSkip}
\let\fndef=\funcdef
\let\endfndef=\endfuncdef
\@newSkips{Fndef}{1ex plus .3ex minus .2ex}{1.75ex plus .4ex minus .2ex}
\@emptyHooks{Fndef}
\@newSkips{Fn}{2ex plus .4ex minus .2ex}{2ex plus .4ex minus .2ex}
\@emptyHooks{Fn}
\newtoks\t@fnop@name
\newif\ifSignatured@            \Signatured@false
\newif\ifImplicit@              
\newif\ifSignature@             \Signature@false
%  function to be used within a let statement. It will be set true 
%  by \@letstmt  (kjl 16/7/91)
\newif\iffirst@let@fn              \first@let@fnfalse
% \fn@in@let@stmt@ is set true when \fn@in@let@ is true but TeX is not in
% maths mode. This indicates that the function is being defined within a
% let statement, and that this let statement is being defined within a
% \begin{stmt} ... \end{stmt} environment (i.e. not within a function).
% So if \fn@in@let@in@stmt is true we have:
%
%       \begin{stmt}
%          \begin{letstmt}
%             \begin{fn}{fred}
%                ...etc...
%             \end{fn}
%          \end{letstmt}
%       \end{stmt}
%
%  rather than:
%
%       \begin{fn}{bert}
%          \signature{A \To B}
%          \parms{x}
%          \begin{letstmt}
%               \begin{fn}{fred}
%                  ...etc...
%               \end{fn}
%         \end{letstmt}
%       \end{fn}
%
% This flag will be used by \funmath.       (kjl, 10/10/91)
% kjl (25/9/91)
\newif\iffn@in@let@in@stmt@       \fn@in@let@in@stmt@false
\def\e@sfn@parms{\ei@parms\ifImplicit@\funmath%
  \else\add@III\Fdef \fi\ignorespaces}
\def\fn{%
      \@fnsemicolon% 
      \iffn@in@let@% 
            \global\First@false% 
            \ifmmode% 
            \else%
                \fn@in@let@in@stmt@true%
            \fi%
      \fi%
      \let\e@parms=\e@fn@parms%
      \@ifoptarg\@fnst{\@fnst e]}}
\def\@fnst#1]{%
  \ifx#1i\Implicit@true\else%
  \ifx#1s\Implicit@false\let\e@parms=\e@sfn@parms% % -- dja
  \else\Implicit@false\fi\fi\@fn}
%  (kjl 16/7/91)
%  be global, otherwise it will not work. (kjl 30/7/91)
\def\endfn{%
      \ifmmode \funmath \sub@III\fi 
      \ifDef@ 
            \postFnHook 
      \else 
            \iffn@in@let@ \else \e@Macro\postFnHook\postFnSkip \fi
      \fi
      \@ignorespaces%
      \global\Signature@false}
% \line@break@after@let is concerned with adding a line break before a
% function signature. It is called by \@fn and only used for functions within 
% let statements/expressions).
%
% It checks if this the first function to be used within a let statement
% then, if there has not been a patdef preceeding, it will NOT add a line
% break. I.e. the macro typesets:
%
%     let fred : A -> B
%               ..etc...
%
% rather than
%
%    let
%       fred : A -> B
%             ..etc...
%
% \line@break@after@let also re-initialises  \first@let@fn and \after@pat@
% to false.  (kjl, 18/9/91)
\def\line@break@after@let{%
          \iffirst@let@fn
              \ifafter@pat@
                  \@linebr
              \fi
          \else
              \@linebr
          \fi
          \global\first@let@fnfalse
          \global\after@pat@false}
\def\@fn#1{%
      \t@fnop@name={#1}%
      \iffn@in@let@%
            \preFnHook%
            \line@break@after@let%
      \else%
            \b@Macro\preFnSkip\preFnHook%
            \lnout@oi
      \fi%
      \@ifoptarg{\opt@annlab{o}}{}}
\def\opt@annlab#1#2]{\annlab[#1]{#2}\ignorespaces}
\newskip\postSignatureSkip      \postSignatureSkip=1ex 
\def\signature{\Signature@true\@iflinebrarg{\@signature}{\@signature{}]}
{\@signature}{\@signature{}]}}
% \funmath will be used by \signature and \parms. 
% It will sometimes be necessary for \signature and \parms to put TeX
% into and take it out of maths mode using '$', EXCEPT IF TeX IS ALREADY 
% IN MATHS MODE. In which case they should do nothing. 
%
% TeX will be in maths mode if the function is being typeset within a
% let statement that is itself being typeset within a function (confused?).
% This will be indicated by \fn@in@let@ being true and \fn@in@let@in@stmt
% being false (even more confused? See the comment above the declaration of
% fn@in@let@in@stmt!).
%
% If this is the case \funmath will do nothing, otherwise it will '$'.
%                                         (kjl, 10/10/91).
\def\funmath{\iffn@in@let@ \iffn@in@let@in@stmt@ $\fi\else $\fi\ignorespaces}
\def\@signature#1]#2{\Signatured@true%
  \ifnl@ 
      \nl@false
      \funmath \the\t@fnop@name\ifx#1\@empty\else[#1]\fi :\add@DI \\#2 \funmath \sub@DI
  \else 
      \b@id@indent{:}{\the\t@fnop@name\ifx#1\@empty\else[#1]\fi}%
      \funmath #2 \funmath\e@id@indent 
  \fi
  \@nopagebreak \iffn@in@let@ \@old@linebr \else \par \fi
  \iffn@in@let@ 
  \else 
      \vskip \postSignatureSkip 
  \fi 
  \leavevmode 
  \ignorespaces}
\newif\ifParentheses@   
\def\parms{\@iflinebrstar{\Parentheses@false\@parms}
                         {\Parentheses@true\@parms}
                         {\Parentheses@false\@parms}
                         {\Parentheses@true\@parms}}
\def\@parms#1{\Signatured@false%
   \ifSignature@ \lnout@i\else\fi \funmath 
   \ifnl@ \add@DI\the\t@fnop@name\\\global\nl@false
     \ifParentheses@\sb@indent{(}#1)\subw@indent{(}\else#1\fi
     \let\ei@parms=\sub@DI
   \else
     \b@id@indent{}{\the\t@fnop@name\mskip\thinmuskip}
     \ifParentheses@ \Lp #1\Rp \else#1\fi
     \let\ei@parms=\e@id@indent
   \fi \@iflinebrarg{\@res}{\e@parms\\}{\@res}{\e@parms}}
\def\@res#1:#2]{%
 \ifSignature@ \@vdmslwarning{result by signature heading or ^^J
    \@spaces \@spaces \@spaces \@spaces \space \space
    signature by colon heading on page \thepage}\fi
 \ifnl@ \\#1:#2\global\nl@false\else\ #1:#2\fi\e@parms}
\def\e@fn@parms{\ei@parms\ifImplicit@\funmath%
  \else\add@III\Fdef\\ \fi\ignorespaces}
\def\@if@i@e#1#2{%
  \@ifnextchar i{\Implicit@true\def\@tmpa i]{#1}\@tmpa}
                {\Implicit@false\def\@tmpa e]{#2}\@tmpa}}
\newif\ifpunct@set@it@      \punct@set@it@false
\def\punct{\ifDef@
              \@fnsemicolon
           \else
              \F@comma
           \fi\global\punct@set@it@true
           }
\def\@semicolon{%
        \ifpunct@set@it@
                \global\punct@set@it@false
        \else
                \ifDef@% 
                        \ifFirstDef@% 
                                \global\FirstDef@false%
                        \else%
                                ;%
                        \fi%
                \else% 
                        \vdm% 
                \fi
        \fi}              
\def\@fnsemicolon{%
      \ifpunct@set@it@
           \global\punct@set@it@false
      \else
           \iffn@in@let@
                \@comma
           \else
                \@semicolon
           \fi
      \fi}
\def\@comma{%
      \iffirst@let@fn
            \ifafter@pat@
                  ,
            \fi
      \else
            ,
      \fi}
  
\@newSkip{Precond}{.5ex plus .1ex minus .1ex}
\@emptyHooks{Precond}
\def\pre#1{\begingroup\precond#1\endprecond\endgroup}
\def\precond{
  \endgroup 
  \ifmmode 
     \iffn@in@let@
        \ifImplicit@ 
              \global\let\e@precond=\@empty
         \else 
              \@expl@Def \sub@III 
              \global\let\e@precond=\add@III  
         \fi
     \else
        \sub@III $%
        \global\def\e@precond{\add@III $}%
     \fi 
  \else
     \ifImplicit@ 
         \global\let\e@precond=\@empty
     \else 
         \@expl@Def \sub@III \global\let\e@precond=\add@III  
     \fi
  \fi
  \iffn@in@let@
     \@old@linebr
  \else
     \b@Macro\prePrecondSkip\prePrecondHook 
  \fi
  \lnout@i
  \kw@indent{pre } 
  \b@mathmode}
\def\endprecond{\e@mathmode \e@precond \sub@kw@indent{pre }%
  \postPrecondHook \@@precond \@ignorespaces}   
\@newSkip{Postcond}{.5ex plus .1ex minus .1ex}
\@emptyHooks{Postcond}
\def\post#1{\begingroup\postcond #1 \endpostcond\endgroup}
% kjl 
\def\postcond{%
  \endgroup
  \ifmmode 
     \iffn@in@let@
        \ifImplicit@ 
              \global\let\e@postcond=\@empty
         \else 
              \@expl@Def \sub@III 
              \global\let\e@postcond=\add@III  
         \fi
     \else
        \sub@III $%
        \global\def\e@postcond{\add@III $}%
     \fi 
  \else
     \ifImplicit@ 
         \global\let\e@postcond=\@empty
     \else 
         \@expl@Def \sub@III \global\let\e@postcond=\add@III  
     \fi
  \fi
  \iffn@in@let@
    \@old@linebr 
  \else
     \b@Macro\prePostcondSkip\prePostcondHook
  \fi 
  \lnout@i
  \kw@indent{post }%
  \b@mathmode}
%kjl
\def\endpostcond{\e@mathmode 
%                 \iffn@in@let@
%                    \ifImplicit@
%                        \add@III
%                    \fi
%                 \fi
                \e@postcond
                \sub@kw@indent{post }\postPostcondHook
                 \@@postcond \@ignorespaces}
\@newSkips{Operdef}{1ex plus .3ex minus .2ex}{1.75ex plus .4ex minus .2ex}
\@emptyHooks{Operdef}
\def\operdef{\@ifoptarg{\@operdef}{\@operdef\w@IIndent]}}
\def\@operdef#1]{\Def@true\FirstDef@true
  \b@Kw@II{operations}{\preOperdefSkip}{\preOperdefHook}{#1}}
\def\endoperdef{\e@Kw@II{\postOperdefHook}{\postOperdefSkip}}
\let\opdef=\operdef
\let\endopdef=\endoperdef
\@newSkips{Opdef}{1ex plus .3ex minus .2ex}{1.75ex plus .4ex minus .2ex}
\@emptyHooks{Opdef}
\@newSkips{Op}{2ex plus .4ex minus .2ex}{2ex plus .4ex minus .2ex}
\@emptyHooks{Op}
\def\op{%
  \@semicolon\let\e@parms=\e@op@parms
  \@ifoptarg{\@if@i@e{\@op}{\@op}}{\Implicit@true\@op}}
\def\endop{\ei@op \ifDef@ \postOpHook \else 
  \e@Macro\postOpHook\postOpSkip \fi \@ignorespaces%
}
\def\@op#1{\t@fnop@name={#1}%
  \b@Macro\preOpSkip\preOpHook\lnout@oi
  \@ifoptarg{\opt@annlab{o}}{}}
\def\e@op@parms{%
  \ei@parms$%
  \ifImplicit@ \gdef\ei@op{}\gdef\@expl@Def{}%
  \else 
    $\Fdef$%
    \def\@expl@Def{\add@III\\
                   \gdef\@expl@Def{}%
                   \gdef\ei@op{\sub@III}}%
  \fi\ignorespaces}
                   
\let\@expl@Def\@empty
\newdimen\wi@wr                 \setbox\tmp@box=\Wr \wi@wr=\wd\tmp@box\relax
\def\ext{\ifImplicit@ 
             \global\let\e@ext=\@empty
                \else
                     \sub@III
                     \global\let\e@ext=\add@III
                \fi 
                \setw@id\@ext}
\def\@ext#1{\@externals#1\endexternals\e@ext}
\def\externals{\ifImplicit@ 
                     \global\let\e@ext=\@empty
                \else
                     \sub@III
                     \global\let\e@ext=\add@III
                \fi 
                \setw@id\@externals}
\def\@externals{\\\kw@indent{ext }\First@true$\@rd@wr}
\def\endexternals{$\sub@kw@indent{ext }\@ignorespaces\e@ext}
\def\@rd@wr{\@ifnextchar\Rd{\def\@tmpa\Rd{\@@ext{\Rd}}\@tmpa}
                           {\@ifnextchar\Wr{\def\@tmpa\Wr{\@@ext{\Wr}}\@tmpa}
                                           {}}}
 
 \def\@@ext#1#2\\{\F@linebr
         \hbox to \wi@wr{#1\hss}\add@indent\wi@wr
         \@@ext@colon#2:{}
         \sub@indent\wi@wr\@rd@wr}       
  
                   
\def\@@ext@colon#1:#2{
           \@ifempty{#2}
                   \@@ext@notype{#1}
           \else
                   \ifx#2:
                        \@@ext@notype@colon{#1}
                   \else
                        \@@ext@type{#1}{#2}
                   \fi
           \fi}
                                                                                    
\def\@@ext@notype#1{\b@id@indent{}{#1}\e@id@indent}
\def\@@ext@notype@colon#1{\b@id@indent{:}{#1}\e@id@indent}
                                                     
\def\@@ext@type#1#2:{\b@id@indent{:}{#1}#2\e@id@indent}
\@newSkip{Exceptions}{.5ex plus .1ex minus .1ex}
\@emptyHooks{Exceptions}
\def\exceptions{\ifImplicit@ 
                     \global\let\e@exceptions=\@empty
                \else
                     \sub@III
                     \global\let\e@exceptions=\add@III
                \fi
                \setw@id\@exceptions}
%%% \@exceptions}
\def\endexceptions{\sub@kw@indent{errs }\@ignorespaces\e@exceptions}
\def\@exceptions{%
 \b@Macro\preExceptionsSkip\preExceptionsHook\lnout@i
 \First@true\kw@indent{errs }\@ignorespaces}
\def\err#1{\F@par@linebr\@iflinebr{\nl@err{#1}}{\sl@err{#1}}}
\def\sl@err#1#2{\b@id@indent{:}{#1}$#2$\e@id@indent\ignorespaces}
\def\nl@err#1#2{$#1:\add@DI\\#2\sub@DI$\ignorespaces}
\@newSkips{Stmt}{2ex plus .5ex minus .3ex}{2ex plus .5ex minus .3ex}
\@emptyHooks{Stmt}
\def\stmt{\@ifoptarg{\@stmt}{\@stmt\z@]}}
\def\@stmt#1]{
  \add@indent{#1}\relax
  \def\endstmt{\sub@indent{#1}\e@Macro\postStmtHook\postStmtSkip}
  \parindent=\z@ \let\par=\@@par%
  \vdm%
  \b@Macro\preStmtSkip\preStmtHook\lnout@oi
  \ignorespaces}
%  kjl 5/3/93
\def\blockstmt{\@expl@Def \Lp \ignorespaces} 
\def\endblockstmt{\Rp \@ignorespaces}
\def\always#1{%
  \@expl@Def
  \kw@indent{always }#1\sub@kw@indent{always }\kw{ in}\@par@linebr}
\def\@trap#1{\@expl@Def \kw@indent{trap }$#1$\ \sub@kw@indent{trap }%
  \@iflinebr{\\\@with}{\@with}}
\def\@with#1{\kw@indent{with }#1\sub@kw@indent{with }\kw{ in}\@par@linebr}
% kjl 5/3/93
\let\trap=\@trap
\def\rectrap{\@expl@Def\setw@bl{\@rectrap}}
%kjl 5/3/93
\def\endrectrap{%
  \}\kw{ in}\subw@indent{\kw{tixe }\{}\@par@linebr}
\def\@rectrap{%
    \let\trap=\F@bls\MN@bls% 
    \let\@sep=\Mapsto% 
    \First@true%
    \def\b@bl@two{\let\trap=\@trap}%
    \def\e@bl@two{\let\trap=\F@bls}%
    \copy@indent{\kw{tixe }\{}%
    \ignorespaces}
\def\dclstmt{\@expl@Def\setw@bl{\@dclstmt}}
\def\enddclstmt{;\sub@kw@indent{dcl }\@par@linebr}
\def\@dclstmt{\First@true\def\@sep{:}\MM@bls
  \kw@indent{dcl }\ignorespaces}
\def\assdef#1{\F@comma@pl\t@bl@one={#1}$\@iflinebr{\ml@assdef}{\sl@assdef}}
\def\sl@assdef#1{\let\ei@assdef=\e@bl\b@bl#1\add@DI
  \@iflinebrarg{\Ass\\\arg@assdef}{\e@assdef}{\Ass\arg@assdef}{\e@assdef}}
\def\ml@assdef#1{\m@bl\add@DI\let\ei@assdef=\sub@DI\\#1\add@DI
  \@iflinebrarg{\Ass\\\arg@assdef}{\e@assdef}{\Ass\arg@assdef}{\e@assdef}}
\def\arg@assdef#1]{#1\e@assdef}
\def\e@assdef{\ei@assdef\sub@DI$\ignorespaces}
  
\def\defstmt{\@expl@Def\setw@bl{\@defstmt}}
%  required.  (kjl, 28/8/91)
\def\enddefstmt{\sub@kw@indent{def }% tixe goes wrong here
%  \ifmmode \def\@tmpa{\kw{ in }}\else \def\@tmpa{;\@par@linebr}\fi \@tmpa}
    \def\@tmpa{\kw{ in }}\@tmpa} 
\def\@defstmt{\def\@sep{=}\First@true\let\eqdef=\F@bls\AM@bls
  \kw@indent{def }\ignorespaces}
\def\Def{\@expl@Def\begingroup\setw@bl{\@Def}}
\def\@Def#1={\AM@bls\kw@indent{def }\def\@sep{=}%
  \t@bl@one={#1}\@iflinebr{\ml@def@expr}{\sl@def@expr}}
\def\ml@def@expr#1\Din{\@bl \add@DI \\ \M@bl@two#1\M@bl@two \sub@DI 
  \endgroup \enddefstmt}
\def\sl@def@expr#1\Din{\b@bl \M@bl@two#1\M@bl@two \e@bl \endgroup \enddefstmt}
\def\letstmt{\@expl@Def\setw@bl{\@letstmt}}
% This always had a line-break after the `Lin' part, now the user
% must put one in if so desired.
\def\endletstmt{%
      \fn@in@let@false
      \kw{ in }\sub@kw@indent{let }}
\newif\iffn@in@let@     \fn@in@let@false
\newif\iffirst@let@fn   \first@let@fnfalse
\newif\ifafter@pat@       \after@pat@false
\def\patdef{%
      \let\e@bls\relax%
      \iffn@in@let@\after@pat@true\def\@sep{=}\fi\AM@bls\F@bls}
\def\@letstmt{%
\First@true\fn@in@let@true\first@let@fntrue\kw@indent{let }\ignorespaces}
\def\Let{\@expl@Def\begingroup\setw@bl{\@Let}}
\def\@Let#1={\AM@bls\t@bl@one={#1}\def\@sep{=}%
  \kw@indent{let }\@iflinebr{\ml@let@expr}{\sl@let@expr}}
\def\ml@let@expr#1\Lin{\@bl \add@DI \\ \M@bl@two#1\M@bl@two \sub@DI 
  \endgroup \endletstmt}
\def\sl@let@expr#1\Lin{\b@bl \M@bl@two#1\M@bl@two \e@bl \endgroup \endletstmt}
\def\letbestmt{\@expl@Def \let\endletbestmt=\endletstmt \setw@bl{\@letbestmt}}
\def\@letbestmt{\def\@sep{\kw{ be st }}\AM@bls
  \First@true
  \kw@indent{let }\ignorespaces}
\def\such#1{\F@comma@linebr\t@bl@one={#1}%
  \@iflinebrarg{\@arg@such}{\M@bl@two#1\M@bl@two}
               {\@arg@such}{\M@bl@two#1\M@bl@two}}
\def\@arg@such#1]{\ifnl@\nl@false \ml@bls{#1}\else\sl@bls{#1}\fi%
  }
\def\Letbe{\@expl@Def \begingroup \AM@bls \kw@indent{let }%
  \@ifstar{\@letbe}{\@letbest}}
\def\@letbe#1\Lin{\M@bl@one#1\M@bl@one\endletstmt\endgroup}
\def\@letbest{\setw@bl{\@@letbest}}
\def\@@letbest#1\Best{\t@bl@one={#1}\def\@sep{\kw{ be st }}%
  \@iflinebr{\ml@let@expr}{\sl@let@expr}}
\def\ass#1{\@expl@Def
           \begingroup\Width@bl@onefalse\AM@bls%
           \t@bl@one={#1}\let\@sep=\Ass
           \let\e@bls=\endgroup\@bls}
\def\nondetstmt{\@expl@Def\sb@indent\Nondet\Lp\ignorespaces}
\def\endnondetstmt{\Rp\subw@indent\Nondet\@ignorespaces}
\def\@Do{\@par@linebr \kw@indent{do }\ignorespaces}
\def\@Od{\sub@kw@indent{do }\@ignorespaces}
\def\seqfor#1{\@expl@Def
  \kw@indent{for }$#1\ $\sub@kw@indent{for }%
  \@iflinebrarg{\\\@rev}{\\\@in{}}{\@rev}{\@in{}}}
  
\let\endseqfor=\@Od
\def\@rev#1rev#2]{\@in{reverse }}
\def\@in#1#2{\kw@indent{in #1}$#2$\sub@kw@indent{in #1}\@Do}
\def\setfor#1{\@expl@Def \let\endsetfor=\@Od
  \kw@indent{for all }$#1 \In\mskip\medmuskip\sub@kw@indent{for all }\add@DI
  \@iflinebr{\\\fa@expr}{\fa@expr}}
\def\fa@expr#1{#1$\sub@DI\@Do}
\def\indfor#1{\@expl@Def \let\endindfor=\@Od
  \kw@indent{for }$#1 =\mskip\medmuskip\sub@kw@indent{for }\add@DI
  \@iflinebr{\\\ind@is}{\ind@is}}
\def\ind@is#1{#1\mskip\medmuskip\sub@DI
  \@iflinebr{\\\ind@to}{\ind@to}}
\def\ind@to#1{\kw@indent{to }#1\mskip\medmuskip\sub@kw@indent{to }%
  \@iflinebrarg{\\\ind@by}{$\@Do}{\ind@by}{$\@Do}}
\def\ind@by#1]{\kw@indent{by }#1\sub@kw@indent{by }$\@Do}
\def\while#1{\@expl@Def \let\endwhile=\@Od
  \kw@indent{while }$#1$\sub@kw@indent{while }\@Do}
\def\Call#1(#2){\call{#1}{#2}}
\def\call#1{\@expl@Def\begingroup\Width@bl@onefalse\AM@bls\def\@sep{\,(}%
  \t@bl@one={#1}%
  \ifmmode\def\e@call{\endgroup\ignorespaces}% kjl 5/3/93
  \else$\def\e@call{$\endgroup\ignorespaces}\fi
  \@iflinebr{\ml@call}{\sl@call}}
\def\sl@call#1{\the\t@bl@one \add@DI \Lp #1 \sub@DI \Rp \@@call}
\def\ml@call#1{\the\t@bl@one\add@DI
  \\\Lp #1\sub@DI \Rp \@@call}
\def\@@call{\mskip\medmuskip
  \@iflinebrarg{\\\arg@call}{\e@call\\}{\arg@call}{\e@call}}
\def\arg@call#1]{\kw@indent{using }#1\sub@kw@indent{using }\e@call}
\def\If#1\Then{\@expl@Def\begingroup
  \let\endIf=\Fi
  \kw@indent{if }\ifmmode#1\else$#1$\fi
  \def\e@if{\sub@kw@indent{if }}\b@then}
\def\b@then{\e@if
  \@iflinebr{\\\kw@indent{then }%
             \def\e@then@else{\sub@kw@indent{then }}\ignorespaces}
            {\kw{ then }\let\e@then@else=\@empty}}
\def\Else{\e@then@else
  \@iflinebr{\ifmmode\\\else\@par@linebr\fi\kw@indent{else }%
             \def\e@then@else{\sub@kw@indent{else }}\ignorespaces}
            {\kw{ else }\let\e@then@else\@empty}}
\def\Elseif{ \e@then@else
  \ifmmode\\\else\@par@linebr\fi\kw@indent{elseif }%
  \def\e@if{\sub@kw@indent{elseif }}\b@elseif}
\def\b@elseif#1\Then{\ifmmode#1\else$#1$\fi\b@then}
\def\Fi{\e@then@else\endgroup\ignorespaces}
\def\@endMcCarthy{\Rp}
\def\McCarthy{\@expl@Def\let\endMcCarthy=\@endMcCarthy%
\setw@bl\@McCarthy}
\def\@McCarthy{\First@true\Lp\MN@bls
  \let\@sep=\To \let\gustmt=\F@bls \ignorespaces}
\def\Cases{\@expl@Def
           \def\endCases{%
                         \sub@III\\\kw{end}}
           \setw@bl\@cases}
\def\@cases#1{%
        \First@true\let\@sep=\To 
        \let\e@bls=\relax    % kjl 26/2/93
        \let\alt=\F@bls\MN@bls
        \kw@indent{cases }
        \ifmmode
            #1:
        \else
            $#1:$
        \fi
        \sub@kw@indent{cases }%
        \add@III\\\ignorespaces}
\def\others{\F@bls{\kw{others}}}
\def\return#1{\@expl@Def$\kw@indent{return }#1\sub@kw@indent{return }$}
\def\isnotyetspec{\@expl@Def$\kw@indent{is not yet specified}\sub@kw@indent{is not yet specfied}$}
\def\exit#1{\@expl@Def$\kw@indent{exit }#1\sub@kw@indent{exit }$}
\def\Error{\@expl@Def\kw{error}} 
\def\Skip{\@expl@Def\kw{skip}} 
\def\Inyd{\@expl@Def\kw{ is not yet defined}}%
\@newSkips{Expr}{2ex plus .5ex minus .3ex}{2ex plus .5ex minus .3ex}
\@emptyHooks{Expr}
\def\expr{\@ifoptarg{\@expr}{\@expr\z@]}}
% Have moved \vdm from its orignal position, just before \b@mathmode,
% for the same reason as described in the comment before \@stmt 
% kjl 24/7/92
\def\@expr#1]{%
  \add@indent{#1}\relax
  {\let\sub@indent=\relax\xdef\ei@expr{\sub@indent{#1}}}%
  \parindent=\z@ \let\par=\@@par
  \vdm%
  \b@Macro\preExprSkip\preExprHook\lnout@oi
  \b@mathmode \@ignorespaces}
\def\endexpr{\ei@expr \e@mathmode \e@Macro\postExprHook\postExprSkip}
\let\defexpr=\defstmt
\let\enddefexpr=\enddefstmt
\let\letexpr=\letstmt
\let\endletexpr=\endletstmt
\let\letbeexpr=\letbestmt
% Caused problems with the end of letbeexpr environments.
%\let\endletbeexpr=\endletbestmt
\let\endletbeexpr=\endletstmt
\def\mapinv#1{#1^{-1}}
\newdimen\wi@q@expr
\def\q@expr#1#2{\@expl@Def\@iflinebr{\ml@q@expr{#1}{#2}}{\sl@q@expr{#1}{#2}}}
\def\sl@q@expr#1#2#3{\begingroup \Id@w@false 
  \b@id@indent{\Dot}{#1#2}#3\e@id@indent \endgroup}
\def\ml@q@expr#1#2#3{#1#2\Dot\add@DI\\#3\sub@DI}
\def\all{\q@expr\All}
\let\@exists=\exists 
\def\restoreExists{\let\exists=\@exists}
\def\useExists{\gdef\exists{\q@expr\Exists }}
\useExists
\def\unique{\q@expr\Unique }
\let\@iota=\iota 
\def\restoreIota{\let\iota=\@iota}
% Replaced line below because clashed with LaTeX macro
% \def\useIota{\gdef\iota{\q@expr\Iota }}
\def\useIota{\gdef\iota{\q@expr\Iotaop }}
\useIota
\let\@lambda=\lambda 
\def\restoreLambda{\let\lambda=\@lambda}
% Replaced line below because clashed with LaTeX macro
% \def\useLambda{\gdef\lambda{\q@expr\Lambda }}
\def\useLambda{\gdef\lambda{\q@expr\Lambdaop }}
\useLambda
\def\set#1{\sb@indent\lbrace #1\rbrace \subw@indent\lbrace}
% The \endgroups match the \begingroup in \setcomp or \seqcomp.
\def\@compr#1{\sb@indent\@lb@sb #1|\subw@indent\@lb@sb
  \@iflinebr{\@@compr\\}{\@@compr{}}}
\def\@@compr#1#2{\add@DI #1#2 \@if@compr@expr}
\def\@if@compr@expr{%
  \@iflinebr{\@ifoptarg{\@compr@expr{\\}}{\sub@DI\@rb@sb\endgroup\\}}
            {\@ifoptarg{\@compr@expr}{\sub@DI\@rb@sb\endgroup}}}
\def\@compr@expr#1#2]{\add@DI \Dot\strut #1#2\sub@DI\sub@DI
  \@rb@sb\endgroup}
  
% The \begingroup keeps \@rb@sb and \@lb@sb local.
% The corresponding \endgroup is in \@compr.
\def\setcomp{\begingroup\let\@rb@sb=\rbrace \let\@lb@sb=\lbrace \@compr}
\def\setrange#1{\@iflinebr{\@setrange{#1,\\}}{\@setrange{#1,}}}
\def\@setrange#1#2{\set{#1\ldots,#2}}
\def\seq#1{\addw@indent[[#1]\subw@indent]}
% The \begingroup keeps \@rb@sb and \@lb@sb local.
% The corresponding \endgroup is in \@compr.
\def\seqcomp{\begingroup\let\@rb@sb=]\let\@lb@sb=[\@compr}
\def\subseq#1{\def\@fexpr{#1\mskip\thinmuskip}%
  \@iflinebr{\ml@subseq}{\sl@subseq}}
\def\sl@subseq#1{\let\@@subseq=\sl@expex
  \@iflinebr{\@l@subseq{#1,\\}}{\@l@subseq{#1,}}}
\def\ml@subseq#1{\let\@@subseq=\ml@expex%
  \@iflinebr{\@l@subseq{#1,\\}}{\@l@subseq{#1,}}}
\def\@l@subseq#1#2{\@@subseq{#1\ldots,#2}}
\def\seqmod#1{\def\@smod{#1\Override}\@iflinebr{\ml@seqmod}{\sl@seqmod}}
\def\ml@seqmod#1{\@smod \add@DI \\ \sb@indent\lbrace #1\rbrace 
  \subw@indent\lbrace \sub@DI}
\def\sl@seqmod#1{\b@expr@box \@smod \e@expr@box
  \sb@indent\lbrace #1\rbrace\subw@indent\lbrace \ei@expr@box}
\let\map=\set
\let\mapcomp=\setcomp
% NDN: changed from \let\reccons\=expex as \expex not defined at
% this point.
\def\reccons{\expex}
\def\recmod#1{\def\@rmod{#1,}%
  \sb@indent{\Muop \mskip\medmuskip(}%
  \def\ei@recmod{\subw@indent{\Muop\mskip\medmuskip(}}
  \@iflinebr{\ml@recmod}{\sl@recmod}}
\def\ml@recmod#1{\@rmod%
                 \ei@recmod%
                 \add@DI \\%
                 \save@indent@and@expr
                  #1)
                 \restore@indent@and@expr
                 \sub@DI}
\def\sl@recmod#1{
       \b@expr@box 
             \@rmod 
       \e@expr@box 
       \save@indent@and@expr
       #1)
       \restore@indent@and@expr
       \ei@expr@box 
       \ei@recmod}
\newdimen\car@out
\def\@lil{}
\def\@@cons#1#2{%
              \xdef#1{{\the#2} #1} 
}
\def\@@car#1#2\@lil{\car@out=0.0pt
           \car@out=#1
}
\def\@@cdr#1#2\@lil{#2}
\def\@@head#1{%
      \expandafter\@@car#1\@lil
      \xdef#1{\expandafter\@@cdr#1\@lil}   
}
\def\@@tail#1{%
      \xdef#1{\expandafter\@@cdr#1\@lil}    
}
\newcount\coun@car@out
\def\@@coun@car#1#2\@lil{\coun@car@out=0
           \coun@car@out=#1
}
\def\@@coun@head#1{%
%      \typeout{>>>> #1}
      \expandafter\@@coun@car#1\@lil
      \xdef#1{\expandafter\@@cdr#1\@lil}
}
\def\fnapply{\@ifstar{\Parentheses@false\@fnapply}{\Parentheses@true\@fnapply}}
\def\@fnapply#1{\def\@fnname{#1}\let\@fnapp=\@fnname
  \@iflinebrarg {\type@fnapply{\\}}{\ml@fnapply}
                {\type@fnapply{\mskip\medmuskip\relax}}{\sl@fnapply}
}
\def\type@fnapply#1#2]{%
  \def\@fnapp{\@fnname \add@DI [#1#2]\sub@DI}%
  \@iflinebr{\ml@fnapply}{\sl@fnapply}}
\newdimen\old@indent   
\newdimen\old@expr        
\def\wi@stack{}
\def\save@indent@and@expr{%
         \old@indent=\wi@indent
         \old@expr=\wi@expr
         \@@cons{\wi@stack}{\old@indent}
         \@@cons{\wi@stack}{\old@expr}
}
\def\restore@indent@and@expr{%
         \@@head\wi@stack  
         \global\wi@expr=\car@out
         \@@head\wi@stack  
         \global\wi@indent=\car@out
}
\def\sl@fnapply#1{%
                  \b@expr@box 
                  \@fnapp
                  \mskip\thinmuskip
                  \e@expr@box
                  \save@indent@and@expr
                  \ifParentheses@
                        \Lp #1 \Rp
                  \else
                            #1
                  \fi
                  \restore@indent@and@expr
                  \ei@expr@box        
}
\def\ml@fnapply#1{%
           \@fnapp%
           \add@DI\\
           \save@indent@and@expr
           \ifParentheses@ 
                 \Lp #1\Rp 
           \else 
                     #1
           \fi 
           \restore@indent@and@expr 
           \sub@DI}
\def\@cmtline{\ifSignatured@%
                 \global\Signatured@false%
              \else%
                 \newline%
              \fi%
              \lnout@i%
              \hbox\bgroup\CommentFont\Comment
            } 
\newif\ifSignatureDealt@
\def\comms{\begingroup%
              \ifSignatured@%
                 \global\SignatureDealt@true%
              \else%
                 \global\SignatureDealt@false%
              \fi%
              \def\\{\egroup\@cmtline}%
              \@cmtline
             }
\def\endcomms{\egroup%
                 \endgroup%
                 \ifSignatureDealt@%
                    \newline
                 \else \\%
                 \fi
                }   
\def\comm#1{\hbox{\Comment\CommentFont #1}}
\newdimen\w@AnnIndent                   \w@AnnIndent=1em\relax
\newdimen\wi@ann
\newdimen\wi@ainn
\newskip\AnnSkip \AnnSkip=1ex plus .3ex minus .2ex
\@newSkips{Annotations}{1.75ex plus .4ex minus .2ex}{1.75ex plus .4ex minus.2ex}
\@emptyHooks{Annotations}
\newif\ifannrefused@
\global\annrefused@false
\def\annotations{\global\annrefused@true%
\@ifoptarg{\@annotations}{\annotations[\z@]}}
\long\def\@annotations#1]#2{%
  \b@Macro\preAnnotationsSkip\preAnnotationsHook{}%
  \hskip\wi@ln\kw{annotations}%
  \@restoreMargins \VDM@false
  \AnnotationsFont
  \newdimen\wi@old@indent\wi@old@indent=\wi@indent
  \addtoindent{AnnIndent}{#1}%
  \nolinenumbering \reset@linebreaks \def@ann
  \def\@ao{\@num{#2}}%
  \def\par{\@@par\penalty\@M\hangindent\wi@ann
    \def\par{\@@par\hangindent\wi@ann}}}
\def\endannotations{%
  \rmfamily
  \global\wi@indent=\wi@old@indent
  \parindent=\wi@ln\@@par
  \vskip\AnnSkip\leavevmode \kw{end annotations}%
  \ifDef@\postAnnotationsHook\else
    \e@Macro\postAnnotationsHook\postAnnotationsSkip\fi\@ignorespaces}
\def\setw@ann{\wi@ainn=\w@inner \advance\wi@ainn by \w@AnnIndent\relax
  \wi@ann=\wi@ln \advance\wi@ann by \w@AnnIndent \relax
  \wi@indent=\wi@old@indent \add@indent\w@IIIndent \add@indent\w@AnnIndent
  \hangindent\wi@ann\parindent=\wi@ann}
\def\@annlab[#1]{\@bsphack
  \ifx#1i\def\@tmpa{\@labeldef{\the\c@inner}\themodule}%
  \else \ifx#1o\def\@tmpa{\@labeldef{\the\c@outer}\themodule}%
  \else \ifx#1m\def\@tmpa{\@labeldef{}\themodule}%
  \else \ifx#1p\def\@tmpa{\@labeldef{}{}}%
  \else \def\@tmpa{??
    \@vdmslwarning{wrong \string\annlab\space format [#1] on page \thepage}}%
  \fi\fi\fi\fi\@esphack\@tmpa}
\def\@labeldef#1#2#3{\@bsphack\if@filesw {\let\thepage\relax
   \def\protect{\noexpand\noexpand\noexpand}%
   \xdef\@gtmpa{\write\@auxout{\string
      \annlabdef{#3}{{#1}{\thepage}{#2}}}}}\@gtmpa \fi
  \edef\@gtmpa{\noexpand\annlabdef{#3}{{#1}{\thepage}{#2}}}\@gtmpa
  \@esphack}
\def\annlabdef#1#2{\expandafter\gdef\csname @r@#1\endcsname{#2}}
\def\annref{\global\annrefused@true%
\@ifoptarg{\@annref}{\@lnrannref{}{}}}
\def\@annref#1]{\def\@tmpa{a#1}%
  \ifx\@tmpa\@a@di \def\@tmpb{\@lnrannref .{}}%
  \else\ifx\@tmpa\@a@od \def\@tmpb{\@lnrannref {}.}%
  \else\ifx\@tmpa\@a@odi
    \def\@tmpb##1{\@lnrannref{\@num{##1}.}{}}%
  \else\ifx\@tmpa\@a@o \def\@tmpb{\@lnrannref{}{}}%
  \else\ifx\@tmpa\@a@i \def\@tmpb{\@lnrannref{}{}}%
  \else\ifx\@tmpa\@a@p \let\@tmpb=\@pannref
  \else\ifx\@tmpa\@a@m \let\@tmpb=\@mannref
  \else \def\@tmpb{%
    \@vdmslwarning{wrong \string\annref\space format [#1] on page \thepage}??}%
  \fi\fi\fi\fi\fi\fi\fi\@tmpb}
\def\@lnrannref#1#2#3{{\LineNrFont#1\@num{#3}#2}}
\def\@pannref#1{\@ifundefined{@r@#1}
  {\@vdmslwarning{page reference #1 on page \thepage\space undefined}??}%
  {\edef\@tmpb{\@nameuse{@r@#1}}\expandafter\@carcdr\@tmpb \@nil\null}}
\def\@mannref#1{{\ModuleNrFont\@ifundefined{@r@#1}
  {\@vdmslwarning{module reference #1 on page \thepage\space undefined}??}%
  {\edef\@tmpb{\@nameuse{@r@#1}}\expandafter\@cdrcdr\@tmpb \@nil\null}}}
\def\@carcdr#1#2#3\@nil{#2}
\def\@cdrcdr#1#2#3\@nil{#3}
\def\@num#1{%
  \def\@tmpe{%                                        
    \@vdmslwarning{wrong argument #1 by \string\ann\space on page \thepage}??}%
  \ifcase \catcode`#1
  \or\or\or\or\or\or\or\or\or\or
  \or \def\@tmpe{\@ifundefined{@r@#1}                 
    {\@vdmslwarning{reference #1 on page \thepage\space undefined}??}%
  {\edef\@tmpf{\@nameuse{@r@#1}}%      
                \expandafter\@car\@tmpf \@nil\null}}%
  \or \def\@tmpe{#1}%                               
  \fi\@tmpe}
\def\ann{\@ifoptarg{\lnr@ann}{\b@Macro\AnnSkip{}\ignorespaces}}
\def\lnr@ann#1]{\def\@a@a{a#1}%
  \ifx\@a@a\@a@di \def\@ann##1{\@annlnr{}{\@num{##1}}}%
  \else\ifx\@a@a\@a@didi \def\@ann##1##2{\@annlnr{}
    {\@num{##1}--.\@num{##2}}}%
  \else\ifx\@a@a\@a@od \def\@ann{\@annlnr{\@ao}{}}%
  \else\ifx\@a@a\@a@odi \def\@ann##1{\@annlnr{\@ao}{\@num{##1}}}%
  \else\ifx\@a@a\@a@odidi
    \def\@ann##1##2{\@annlnr{\@ao}{\@num{##1}--.\@num{##2}}}%
  \else\ifx\@a@a\@a@fdf \let\@ann=\@annlnr
  \else\ifx\@a@a\@a@fd \def\@ann##1{\@annlnr{##1}{}}%
  \else\ifx\@a@a\@a@df \def\@ann{\@annlnr{}}%
  \else\ifx\@a@a\@a@f \let\@ann=\@annf
  \else 
    \def\@ann{\@annf{\@vdmslwarning{wrong \string\ann\space 
                                    format [#1] on page \thepage}??}}%
  \fi\fi\fi\fi\fi\fi\fi\fi\fi\@esphack \@ann}
\def\b@ann{ \par\vskip\AnnSkip \leavevmode \hbox to \z@\bgroup\hss}
\def\e@ann{\egroup\ignorespaces}
\def\@annlnr#1#2{\b@ann \LineNrFont #1% 
  \hbox to \wi@ainn{\LineNrFont.#2\hss}\e@ann}
\def\@annf#1{\b@ann \hbox to \wi@ann{\LineNrFont#1\hss}\e@ann}
\def\def@ann{\@bsphack
  \def\@a@f{af} \def\@a@df{a.f} \def\@a@fd{af.} \def\@a@fdf{af.f}\def\@a@od{ao.}
  \def\@a@di{a.i} \def\@a@odi{ao.i} \def\@a@odidi{ao.i-.i} \def\@a@didi{a.i-.i}
  \def\@a@p{ap} \def\@a@m{am}\def\@a@i{ai}\def\@a@o{ao}\@esphack}
\def\@vdmslwarning#1{\typeout{!!! VdmSl warning: #1.}}
% kjl 20/8/93
\def\lineup{\@ifoptarg\@lineup{\@lineup w]}}
\def\@lineup#1]{%
  \ifx#1c\let\@tmpa=\@lineupc
    \else\ifx#1w\let\@tmpa=\@lineupw
      \else\ifx#1k\let\@tmpa=\@lineupk
        \else\ifx#1t\let\@tmpa=\@lineupt
          \else \def\@tmpa{??\@vdmslwarning{wrong \string\lineup\space format [#1]
                                              on page \thepage}}%
                                                \fi\fi\fi\fi\@tmpa}
\def\@lineupc#1{\ifmmode\setbox\tmp@box\hbox{$\strut#1\strut$}\else
  \setbox\tmp@box\hbox{#1}\fi
  {\let\@@lineupw\relax \xdef\@gtmpa{\@@lineupw{\the\wd\tmp@box}}}%
  \box\tmp@box\@gtmpa}
\def\@lineupk#1{\ifmmode\setbox\tmp@box\hbox {$\strut#1\strut$}%
  \else \setbox\tmp@box\hbox {#1}\fi
  {\let\@lineupw\relax \xdef\@gtmpa{\@lineupw{\the\wd\tmp@box}}}\@gtmpa}
\def\@@lineupw#1#2{\add@indent{#1}#2\sub@indent{#1}} 
\def\@lineupw#1#2{\hskip#1\relax\add@indent{#1}#2\sub@indent{#1}}
\def\@lineupt#1#2{\ifmmode\hbox to #1{$\strut#2\strut$\hss}\else
  \hbox to #1{#2}\fi
  {\let\@@lineupw\relax \xdef\@gtmpa{\@@lineupw{#1}}}\@gtmpa}
\def\blkindent{\@ifoptarg\@blkindent{\@blkindent w]}}
\def\@blkindent#1]#2{%
  \ifx #1w\hskip #2\add@indent{#2}\def\endblkindent{\sub@indent{#2}}%
  \else \ifx #1i%
    \expandafter\hskip\@nameuse{w@#2}\relax
    {\let\add@indent=\relax
     \xdef\@gtmpa{\add@indent\@nameuse{w@#2}}}\@gtmpa
    \def\endblkindent{{\let\sub@indent=\relax
      \xdef\@gtmpa{\sub@indent\@nameuse{w@#2}}}\@gtmpa}%
  \else ??\@vdmslwarning{wrong \string\begin{blkindent}\space format [#1]
                                    on page \thepage}%
  \fi\fi}
\ifps@
 \def\leftharpoonupfill{$\m@th \mathord\leftharpoonup \mkern-6mu
  \cleaders\hbox{$\mkern-2mu \mathchar"0\cmsy@00 \mkern-2mu$}\hfill
  \mkern-6mu \mathchar"0\cmsy@00$}  % p.357, \leftarrowfill
\else
 \def\leftharpoonupfill{$\m@th \mathord\leftharpoonup \mkern-6mu
  \cleaders\hbox{$\mkern-2mu \mathord\Minus \mkern-2mu$}\hfill % !!! Minus
  \mkern-6mu \mathord\Minus$}  % p.357, \leftarrowfill
\fi
\def\old#1{{%
  \boxmaxdepth=\maxdimen % this fixes Lamport's figures, but isn't necessary
                         % for versions after 15 Dec 87
  \vbox{\ialign{##\crcr % p.359, \overleftarrow
    \leftharpoonupfill\crcr\noalign{\kern-\p@\nointerlineskip}
    $\hfil\displaystyle{#1}\hfil$\crcr}}}}
\def\pex#1{\Lp #1\Rp}                                    
\def\Lp{\@expl@Def\sb@indent(}                           
\def\Rp{)\subw@indent(}
\def\parentheses{\Lp \def\endparentheses{\Rp \@ignorespaces}} 
                                                              %.. \end{..} -%
\def\expex#1{%
     \@expl@Def
     \def\@fexpr{#1\mskip\thinmuskip}%
     \@iflinebr{\ml@expex}{\sl@expex}
}
% \sl@expex makes use of macros \b@expr@box, \e@expr@box and
% \ei@expr@box. They will affect the values \wi@indent and \wi@expr
% globally and therefore cause problems after \expex is used. 
% And so the values of \wi@expr and \wi@indent must be saved 
% at the start of \sl@expex and restored at the end.  kjl 21/8/92
\def\sl@expex#1{%
      \begingroup
      \save@indent@and@expr
         \b@expr@box 
            \@fexpr 
         \e@expr@box 
         \Lp #1\Rp 
         \ei@expr@box
      \restore@indent@and@expr
      \endgroup
}
\def\ml@expex#1{\@fexpr \add@DI\\ \Lp #1\Rp \sub@DI}
\newbox\@expr@box
\newdimen\wi@expr
\def\b@expr@box{\setbox\@expr@box=\hbox \bgroup \let\\=\@expr@linebr $}
\def\e@expr@box{\strut$\egroup 
  \wi@expr=\wd\@expr@box \box \@expr@box \global\advance\wi@indent by\wi@expr
}
\def\ei@expr@box{\global\advance\wi@indent by -\wi@expr}
\def\@expr@linebr{\strut$\egroup \box\@expr@box \@linebr \b@expr@box}
%       Proofs
\@newSkips{Proof}{1.2ex plus .2ex minus .1ex}{1.2ex plus .2ex minus .1ex}
\@emptyHooks{Proof}
\newdimen\w@ProofIndent \w@ProofIndent=\parindent
\newdimen\w@ProofNumber \w@ProofNumber=\parindent
\long\def\proof{\par\vskip\preProofSkip\preProofHook
  \def\From{\@indentProof\kw{from }\=%
            \global\advance\@indentLevel by \@ne
            \@enterMathMode}%
  \def\Infer{\global\advance\@indentLevel by-\@ne
             \@indentProof\kw{infer }\@enterMathMode}%
  \def\By{\`}%
  \def\&{\@indentProof\@enterMathMode}
  \let\Line\&
        % this enters math mode and sets the LaTeX macros \@stopfield up
        % to exit math mode
  \def\@enterMathMode{\def\@stopfield{$\egroup}$}
  \reset@linebreaks
  \moveright\w@ProofIndent\vtop\bgroup
    \@indentLevel=1
    \advance\linewidth by-\w@ProofIndent
    \begin{tabbing}%
    \hbox to\w@ProofNumber{}\=\kill}    % template line
\def\endproof{\end{tabbing}\egroup % ends the \vtop
        \e@Macro\postProofHook\postProofSkip}
\newcount\@indentLevel
\newcount\@indentCount
\def\@indentProof{% do \>, \@indentLevel times
        \global\@indentCount=\@indentLevel
        \@gloop \>\global\advance\@indentCount by-\@ne
        \ifnum\@indentCount>0
        \repeat}
\def\@gloop#1\repeat{\gdef\@body{#1}\@giterate}
\def\@giterate{\@body \global\let\@gloopNext=\@giterate
        \else \global\let\@gloopNext=\relax \fi \@gloopNext}
\def\trace{\tracingcommands=2\tracingmacros2}
\@changeOtherMathcodes 
\let\@@@end=\@@end
\def\@@end{%
  \ifannrefused@\@vdmslwarning{%
  To get references right it is necessary to run ^^J
  \@spaces\@spaces\@spaces\@spaces\space\space LaTeX TWICE.
}\fi\@@@end}
\leftalignment
\linenumbering
\nomodulenumbering
\initialise@fonts     
\setindent{inner}{1.7em}   
\setindent{outer}{1.5em}  
\endinput
